3

ラケットコントラクトシステムを使用していますが、引数のない関数をエクスポートしたいと思います。これは、引数のないラムダ式を返します。例:

#lang racket
(define (foo)
  (do-somthing)
  (lambda ()
    (do-other things)))

この種の機能の契約書を書く方法を知っている人はいますか?

4

1 に答える 1

2

私はそれが次の線に沿って何かに見えるだろうと思う:

#lang racket/load

(module m racket
  (provide/contract [foo (-> (-> any/c))])
  (define (foo)
    (+ 10 3) ; do something
    (lambda ()
      (+ 40 2) ; do other things
      )))

(module n racket
  (require 'm)
  ((foo)))

(require 'n)

(-> (-> any/c))は、別の関数を返す関数と一致するコントラクトであり、評価されると、単一の整数値を返します。

ただし、の戻り値を緩和したい場合は、の代わりにをfoo使用します。これにより、単一の値だけでなく、任意の数の戻り値が許可されます。検討:anyany/c

(module m racket
  (provide/contract [foo (-> (-> any))])
  (define (foo)
    (+ 10 3) ; do something
    (lambda ()
      (values (+ 40 2) 666); do other things
      )))

Racketドキュメントの高階関数に関するコントラクトを参照してください。

于 2011-02-21T07:28:30.233 に答える