Erlang中的Guard表达式:使用“and”vs使用“逗号”

时间:2015-09-27 16:04:08

标签: erlang

我刚开始学习Erlang,但我无法弄清楚为什么这段代码与函数调用测试不匹配: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).

我错过了两种不同的方法吗?

1 个答案:

答案 0 :(得分:5)

由于运算符优先级,这种情况正在发生。

正如reference中所定义,运算符std::deque位于and之前,因此您在第一个代码段中实际得到的是:

>

因此,在您的情况下,您正在比较sum(N) when (is_integer(N) and N)>0 -> N + sum(N - 1). ,这可能是真的,这就是为什么您的警卫永远不会匹配。

要解决这个问题,你可以这样写下你的警卫:

(true and 3) > 0

P.S。在这种情况下,sum(N) when (is_integer(N)) and (N>0) -> N + sum(N - 1). 的括号不是必需的,但它可能会更加清晰。