2016-08-29 2 views
3

При определении структуры в типизированной ракетке я больше не могу использовать prop:procedure. В нормальной ракетке я могу сделать что-то вроде:Невозможно применить prop: процедура в типизированной ракетке

(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

Больше не так, как в нем работали в '#lang typed/racket' раньше? – Sylwester

+0

'thunk *' также не проверяет тип в Typed Racket на данный момент –

ответ

3

Как сказал @Leif Andersen, опция struct #: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, чтобы получить его в печатный код, и используя cast, чтобы превратить его в процедуру. Например:

#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 вызывается как процедура.

Смежные вопросы