3

我正在使用 Racket 合约系统,我想导出一个没有参数的函数,它返回一个没有参数的 lambda 表达式,例如:

#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,你可以使用 justany而不是any/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 回答