6
我想编写一个Haskell函数,它返回一个附加到自身计数时间的列表(如Python中的lst * count
)。Pointfree版本不能编译,但有意义的版本呢?
我第一次尝试是:
self_append_n :: Int -> [a] -> [a]
self_append_n = concat . replicate
我的理由是,replicate
接受计数和价值,并产生值的列表。当该值本身是一个列表时,剩下的就是将这些列表连接在一起。然而,这给出了一个令人困惑的错误:
Couldn't match type `[a0]' with `[a] -> [a]'
Expected type: [[a0]] -> [a] -> [a]
Actual type: [[a0]] -> [a0]
In the first argument of `(.)', namely `concat'
In the expression: concat . replicate
In an equation for `self_append_n':
self_append_n = concat . replicate
然后我写了一个贴题版本:
self_append_n a b = concat $ replicate a b
和它的作品!
为什么免费版本无法编译,但添加点使其工作?
我明白了。组合失败,因为复制的实际返回类型不是列表,而是函数(它本身返回一个列表)。 – 2014-08-31 21:05:18
是的。不幸的是,Haskell的_curry everything_哲学并不总是一种好处(尽管通常是这样)。 – leftaroundabout 2014-08-31 21:09:09