haskell的评估策略

时间:2017-02-06 10:37:18

标签: haskell evaluation

如果我有这些功能:

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 : []

然而,这不可能是真的。有人能帮帮我吗?

1 个答案:

答案 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]