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

Uma*_*mil 4 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).
Run Code Online (Sandbox Code Playgroud)

......虽然这样做:

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

sum(0) -> 0;
sum(N) when is_integer(N), N>0 -> N + sum(N - 1).
Run Code Online (Sandbox Code Playgroud)

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

rpo*_*kij 5

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

参考文献中所定义,运算符and在之前出现>,因此您在第一个代码段中实际得到的是:

sum(N) when (is_integer(N) and N)>0 -> N + sum(N - 1).
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你正在比较(true and 3) > 0,这不可能是真的,这就是为什么你的后卫永远不会匹配.

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

sum(N) when (is_integer(N)) and (N>0) -> N + sum(N - 1).
Run Code Online (Sandbox Code Playgroud)

is_integer/1在这种情况下,PS括号不是必需的,但这种方式看起来可能更清晰.