我刚开始学习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).
我错过了两种不同的方法吗?
答案 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).
的括号不是必需的,但它可能会更加清晰。