如何在Racket / Plait中提供特定类型的函数作为参数?

时间:2019-01-25 02:26:19

标签: scheme racket plai

我正在编写一个将一个函数和一个列表作为参数的函数。参数函数和列表必须具有相同类型的值。如何确保?

我尝试过:

(define ( (func -> 'a) [lst : (Typeof 'a)])
     ....)

但是,我无法使其正常运行。我也完成了编辫子教程,但没有发现任何相关内容。

是否有可能接受一个特定返回类型的函数?

1 个答案:

答案 0 :(得分:2)

这是您要寻找的吗?

(define f : (('a -> 'a) (listof 'a) -> string)
  (lambda (func lst) "hello"))

然后:

(f (lambda ([x : number]) x) (list 1))

类型检查,但是:

(f (lambda ([x : number]) x) (list "foo"))

不进行类型检查,因为'a与字符串统一(来自"foo"),但也与数字统一(来自x),因此发生类型不匹配。 / p>

请注意

(define f : (('a -> 'a) (listof 'a) -> string)
  (lambda (func lst) "hello"))

(define (f [func : ('a -> 'a)] [lst : (listof 'a)]) : string
  "hello")

是不同的。在前者中,'a跨参数引用相同的类型变量。在后者中,func的{​​{1}}和'a的{​​{1}}是不同的。因此,在后者中,以下表达式类型检查:

lst