我有一个函数,其单个参数可以是以下之一:
eval
)如何将其表达为该论点的契约?
我的第一个猜测是:
(or/c expr? list?)
还有更好的主意吗?
答案 0 :(得分:1)
由于expr?
不存在,因此对于合同的功能部分,应使用procedure?
或使用带有箭头构造函数的东西(例如(-> number? any/c)
)。
此外,由于这是一项功能的合同,因此您应使用->
包括域和范围。
示例:
#lang racket
(require racket/contract)
(require rackunit)
(define/contract (f x)
(-> (or/c (-> number? number?) list?) (or/c number? list?))
(if (list? x)
x
(x 3)))
(check-equal? (f '()) '())
(check-equal? (f add1) 4)