球拍:高阶函数的合约

时间:2011-02-21 06:38:45

标签: functional-programming scheme racket design-by-contract

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

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

有谁知道如何为这种功能写合同?

1 个答案:

答案 0 :(得分: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的返回值,则只使用any代替any/c,它允许任意数量的返回值,而不只是一个值。考虑:

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

请参阅Racket文档中的Contracts on Higher-order Functions