gpt4 book ai didi

recursion - Erlang递归函数的评估(为什么这样做)

转载 作者:行者123 更新时间:2023-12-01 10:59:27 25 4
gpt4 key购买 nike

我开始学习一些 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”的所有返回值使用逻辑 AND?

最佳答案

基本上,您对最后一次调用的看法是正确的,但是在进行分析时,您已将 true 替换为 Start 值,而实际上该值是 :

fold(F, true, [1,2,3])

评估为:

fold(F, true, [1|[2,3]]) -> fold(F, F(1, true), [2,3])

依次评估为:

fold(F, false, [2|3]) -> fold(F, F(2, false) [3])

依次评估为:

fold(F, false, [3|[]]]) -> fold(F, F(3, false), [])

计算结果为:

fold(_, false, []) -> false

因为在上次调用中 Pred 为真,而您返回的是 ToF,这是假的。

关于recursion - Erlang递归函数的评估(为什么这样做),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com