Ракетка: контракты на функции высшего порядка - PullRequest
3 голосов
/ 21 февраля 2011

Я использую систему контрактов Racket и хочу экспортировать функцию без аргументов, которая возвращает лямбда-выражение без аргументов, e. g.:

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

Кто-нибудь знает, как написать контракт для такого рода функции?

1 Ответ

2 голосов
/ 21 февраля 2011

Я подозреваю, что это будет выглядеть примерно так:

#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.

...