2015-09-27 65 views
5

我刚开始学习二郎山,但我想不出为什么这个代码不匹配函数调用测试:SUM(3)保护表达式:使用“和”与使用“逗号”

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N) and N>0 -> N + sum(N - 1). 

......而这样做:

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N), N>0 -> N + sum(N - 1). 

我失去了一些有关的两种不同的方法?

回答

6

这是因为运营商的优先级而发生的。

正如reference定义,运营商and>之前,让你在你的第一个代码段实际得到的是:

sum(N) when (is_integer(N) and N)>0 -> N + sum(N - 1). 

所以你的情况你是比较(true and 3) > 0,这不可能是真实的,这就是你的后卫永远不会匹配的原因。

为了解决这个问题,你可以写你的后卫是这样的:

sum(N) when (is_integer(N)) and (N>0) -> N + sum(N - 1). 

附:在这种情况下,is_integer/1的括号不是必需的,但它可能看起来更清晰。

+0

btw,is_integer(N)不能包含在括号内 –

+0

另外,'和'不会缩短电路(因为','),所以'和'也应该是首选。 –

相关问题