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-reference の構文仕様に完全に従っていないことだと確信していますが、型付きラケットでローカルに定義された関数の例を 1 つまたは 2 つ持つと非常に役立ちます。

4

1 に答える 1

1

The answer is, use letrec:. Well, now I know.

(: 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 '())))
于 2013-02-10T04:09:28.400 に答える