如果我有这些功能:
add :: Int -> Int -> Int
add a b = a+b
map :: (a->b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
当我调用map (add 1) [1,2,3]
时输出为[2,3,4]
但是在这种情况下Haskell的评估是如何工作的?
我的想法:
它与第二个模式匹配,因为map是一个函数而[1,2,3]是一个列表。
然后我们会:
map (add 1) [1,2,3]
= add 1 : map add [2,3]
= add 1 : add 2 : map add [3]
= add 1 : add 2 : add 3 : map add []
= add 1 : add 2 : add 3 : []
然而,这不可能是真的。有人能帮帮我吗?
答案 0 :(得分:2)
add 1
是一元函数f
,而不是add
。所以你最终会得到以下结论。
map (add 1) [1,2,3]
== add 1 1 : map (add 1) [2,3]
== add 1 1 : add 1 2 : map (add 1) [3]
== add 1 1 : add 1 2 : add 1 3 : map (add 1) []
== 2 : 3 : 4 : []
== [2,3,4]