0; sum(N)-6ren">
gpt4 book ai didi

erlang - Erlang 中的保护表达式 : using "and" vs using "comma"

转载 作者:行者123 更新时间:2023-12-05 00:58:19 25 4
gpt4 key购买 nike

我刚开始学习 Erlang 但我不明白为什么这段代码与函数调用 test: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).

我是否遗漏了两种不同的方法?

最佳答案

这是由于运算符优先级而发生的。

reference 中所定义, 运算符(operator) 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 的括号在这种情况下不是必需的,但这样看起来可能更清晰。

关于erlang - Erlang 中的保护表达式 : using "and" vs using "comma",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com