背景:我正在研究匿名遞歸,並且我正在接受實現前奏的挑戰,而不使用任何命名遞歸,只是爲了幫助它在我的腦海中很好地坐下來。我還沒到那裏,一路上我遇到了一些無關但仍然有趣的事情。等效函數產生不同的解釋結果
map1 = \f -> \x -> if (tail x) == []
then [f (head x)]
else f (head x) : (map1 f (tail x))
map2 f x = if (tail x) == []
then [f (head x)]
else f (head x) : (map2 f (tail x))
map3 f (x:xs) = if xs == [] then [f x] else f x : (map3 f xs)
map4 f (x:[]) = [f x]
map4 f (x:xs) = f x : map4 f xs
GHC抱怨第一個,第二個是好的,第三個和第四個只是爲了展示他們如何實現不同。
*Main> map1 (*2) [1..10]
<interactive>:1:15:
No instance for (Num())
arising from the literal `10'
Possible fix: add an instance declaration for (Num())
In the expression: 10
In the second argument of `map1', namely `[1 .. 10]'
In the expression: map1 (* 2) [1 .. 10]
*Main> map2 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map3 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map4 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
如果我向map1添加一個類型簽名,那就很好。
map1 :: Eq a => (a -> b) -> [a] -> [b]
前兩個函數看起來幾乎相同的給我,所以我想我的問題很簡單「這是怎麼回事?」
我不確定您是否有以這種方式編寫的具體原因。爲什麼不使用[]作爲遞歸的基本情況而不是(x:[])?你的任何函數都不能用於空列表。 – 2012-01-17 01:17:10