【发布时间】:2012-09-13 17:38:37
【问题描述】:
我开始学习一些 Erlang,现在我被以下“问题”困住了。
我知道递归的工作原理,并且了解 HigherOrderFunctions 的基础知识。
所以为了更深入地了解整个概念,我自己使用 fold 实现了“lists:all/2”:
fold(_, Start, []) -> Start;
fold(F, Start, [H|T]) -> fold(F, F(H, Start), T).
all(Pred, L) ->
F = fun(H, ToF) ->
case Pred(H) of
true -> ToF;
false -> false
end
end,
fold(F, true, L).
我知道这个版本不关心空列表,但这不是困扰我的问题。我不明白它为什么会这样。
当我使用我的列表 [1,2,3] 并将 Pred 设置为“fun(X) when X == 3 -> true; (_) -> false end”时,它显然返回“false”。但为什么?如果我在返回某些东西之前将其作为最后一次电话在纸上完成,我会得到:
fold(F, F(H, Start), T)
其中 F 是 Pred,F(H, Start) 返回“true”,因为最后一个元素是 3,T 是一个空列表 []。
所以当我做对了,最后一次调用应该是 fold(_, true, []) 并且应该返回 "true" 而它没有返回。
在评估最后一个表达式时,我是在这里遗漏了什么还是我有什么问题?这个函数是否以某种方式对“Pred”的所有返回值使用逻辑与?
【问题讨论】:
-
你的预测可能很有趣(X) -> X == 3 end
标签: recursion erlang evaluation