【问题标题】:Evaluation strategy of haskellhaskell的评估策略
【发布时间】:2017-02-06 10:37:18
【问题描述】:

如果我有这些功能:

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

但这不可能是真的。有人可以帮帮我吗?

【问题讨论】:

  • 为什么不能这样呢?这正是发生的事情。 (add 1 1add 1 2add 1 3 除外。)
  • 哦,我忘记了每一行的 x,所以我会加 1 1:加 1 2:加 1 3:[]。那么它是有道理的,谢谢!

标签: haskell evaluation


【解决方案1】:

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]

【讨论】: