在类型球拍中定义结构时,我无法再使用prop:procedure
。在正常球拍中,我可以做类似的事情:
(struct profile-unit (a t c g)
#:property prop:procedure (thunk* 12))
(define t (profile-unit .1 .1 .2 .6))
(t)
> 12
但是当我在打字/球拍中尝试时,我得到了一个类型检查错误:
(struct profile-unit ([a : Real] [t : Real] [c : Real] [g : Real])
#:property prop:procedure (thunk* 12))
(t)
> Type Checker: Cannot apply expression of type profile-unit, since it is not a function type in: (t)
是否有另一种在类型球拍中定义此属性的方法?
答案 0 :(得分:4)
正如@Leif Andersen所说,#:property
结构选项在类型球拍中不起作用。
但是对于prop:procedure
的特殊情况,您可以使用define-struct/exec
表单。
#lang typed/racket
(define-struct/exec profile-unit ([a : Real] [t : Real] [c : Real] [g : Real])
[(λ (this) 12) : (profile-unit -> Any)])
(define t (profile-unit .1 .1 .2 .6))
(t) ; 12
答案 1 :(得分:2)
typed/racket
中的结果不能包含任何#:property
字段。他们也不支持泛型。
你甚至可以这样称呼它,这对我来说就像是一个错误。
如果你确实想要像一个函数一样调用结构,你可以通过在无类型代码中定义它,使用require/typed
和#:struct
将其转换为类型代码,然后使用{ {3}}将其变成一个程序。例如:
#lang typed/racket
(module foo racket
(provide (struct-out profile-unit)
make-profile-unit)
(struct profile-unit (a t c g)
#:property prop:procedure (thunk* 12))
(define make-profile-unit profile-unit)
((profile-unit 1 2 3 4)))
(require/typed 'foo
[#:struct profile-unit ([a : Real]
[t : Real]
[c : Real]
[g : Real])])
((cast (profile-unit 1 2 3 4) (-> Any)))
在此示例中,profile-unit
被称为过程。