【发布时间】:2017-12-20 02:11:53
【问题描述】:
我正在尝试在flatten 的输出上调用take。问题是take 需要a 的列表,但flatten 返回Any 的列表。有没有办法在它们之间转换?还是我应该采取的其他方法?我无法在 Racket Docs 中找到任何示例。
(: 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)
【问题讨论】:
-
这里的问题是
flatten很难给出一个精确的类型,因为它会使任意深度的列表变平。考虑在这里使用append*;它做了一个更简单的事情,因此有一个更好的类型。
标签: functional-programming scheme racket typed-racket typed