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