take
をflatten
の出力に呼び出そうとしています。問題は、take
はa
のリストを必要としますが、flatten
はAny
のリストを返します。それらの間で変換する方法はありますか?あるいは私が取るべき別のアプローチ?私はRacket Docsで例を見つけることができませんでした。型付きラケットすべてに変換するすべて(a)
(: extend (All (a) (-> (Listof a) Integer (Listof a))))
(define (extend l n)
; extend a list to length 'n' by appending it to itself
;
; @l list of any
; @n int
; @return list of any
(take (flatten (make-list n l)) n))
インタープリタからは、参照するための各関数の正確な型がここにあります。
> take
- : (All (a) (-> (Listof a) Integer (Listof a)))
#<procedure:take>
> flatten
- : (-> Any (Listof Any))
#<procedure:flatten>
参考までにエラーメッセージもあります。
alg/waterfall.rkt:65:2: Type Checker: Polymorphic function `take' could not be applied to arguments:
Argument 1:
Expected: (Listof a)
Given: (Listof Any)
Argument 2:
Expected: Integer
Given: Integer
Result type: (Listof a)
Expected result: (Listof a)
ここで問題となるのは、「平坦化」は、任意の深さのリストを平坦化するため、正確な型を指定することは実際には困難です。代わりにここで 'append *'の使用を検討してください。それはより簡単なことであり、したがってより良いタイプを持っています。 –