无法在类型球拍

时间:2016-08-29 19:52:15

标签: structure racket typed-racket

在类型球拍中定义结构时,我无法再使用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)

是否有另一种在类型球拍中定义此属性的方法?

2 个答案:

答案 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被称为过程。