2013-02-10 3 views
1

Мне сложно определить, как использовать локальную форму в Typed Racket.Локальное определение использования в типизированной ракетке

, что случилось с этим:

(: make-random-emetype-list (Range -> (Listof EmeType))) 
(define (make-random-emetype-list range) 
(local ([define how-many-types (random-integer (Range-lower range) (Range-upper range))] 
     [define: (bld-lst lst remaining) : ((Listof EmeType) Integer -> (Listof EmeType)) 
      (cond [(< remaining 1) lst] 
       [else (bld-lst (cons (new-emetype) lst) (- remaining 1))])])   
(bld-lst '() how-many-types))) 

Я уверен, что проблема в том, что я не совсем понимаю синтаксической спецификации в TS-ссылки, но это было бы очень полезно иметь пример или две из локально определенных функций в типизированной ракетке.

ответ

1

Ответ есть, использование letrec :. Ну, теперь я знаю.

(: make-random-emetype-list (Range -> (Listof EmeType))) 
(define (make-random-emetype-list range) 
    (letrec: ([lower : Integer (Range-lower range)] 
     [upper : Integer (Range-upper range)] 
     [how-many : Integer (random-integer lower upper)] 
     [bld-lst : (Integer (Listof EmeType) -> (Listof EmeType)) (lambda: ([remaining : Integer] [lst : (Listof EmeType)]) 
                    (cond [(< remaining 1) lst] 
                      [else (bld-lst (- remaining 1) (cons (new-emetype) lst))]))]) 
    (bld-lst how-many '()))) 
Смежные вопросы