2012-09-21 27 views
3

我开始学习一些Erlang,现在我陷入了下面的“问题”。Erlang递归函数的评估(为什么这个工作)

我知道递归如何工作,我知道HigherOrderFunctions的基础知识。

因此,要获得更多的到整个的概念,我实现“名单:所有/ 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),当X == 3 - > true;(_) - > false end”时,它显然返回“false”。但为什么?如果我的工作这通过在纸上最后一次调用返回的东西之前,我:

fold(F, F(H, Start), T) 

其中F是强的松和F(H,start)返回“真”,因为最后一个元素是3和T是一个空列表[]。

所以当我得到这个正确的时候,最后一次调用应该是fold(_,true,[]),因此应该返回“true”,而不是。

我在这里错过了什么,或者在评估最后一个表达式时会出错吗?这个函数是否对某些“Pred”的返回使用逻辑AND?

+2

你的预计值可能会很有趣(X) - > X == 3月底 – Isac

回答

4

基本上,你说得对,最后一次通话,但这样做你的分析时,你已经取代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,这是假的。

+0

OMG,谢谢,我知道必须有在我的想法中是一个错误;) –

2

Try to avoid complex solutions for simple problems(代码紧凑性的函数式语言的好处之一):

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

我知道,如果不仅仅是为了更多地了解HighOrderFunctions的整个概念,而且我想看看我是否能用fold/3因为它表示几乎所有列表问题都可以通过使用fold/3来解决。无论如何感谢:) –

+0

@abdrl:你的功能完全正是它的名字所暗示的。只有在列表L中的所有**元素都被Pred函数评估为真时,它才返回true,而在所有其他情况下则为false。 – Pascal