繁体   English   中英

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

[英]Evaluation of Erlang recursive function (why does this work)

我开始学习一些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设置为“有趣(X)时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?

基本上,你说得对,最后一次通话,但这样做你的分析时,你已经取代trueStart值,其中实际上这个值是false

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 ,这是假的。

尽量避免针对简单问题的复杂解决方案 (代码紧凑性是函数式语言的一个优点):

all(_, []) ->
   true;
all(Pred, [H|T]) ->
   case Pred(H) of
      true ->
         all(Pred, T);
      false ->
         false
   end.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM