Erlang多个守卫在`何时`

Erlang多个守卫在`何时`,erlang,pattern-guards,Erlang,Pattern Guards,各位堆垛工人 我目前正在学习二郎。 有人能告诉我为什么我会得到一个非法的守卫表达式 在长度(素数)==0时添加新素数(Idx,素数,Ref);数学:sqrt(Idx)Ref++[Idx] 如果我在长度(素数)=:=0->Ref++[Idx]时只通过添加新素数(Idx,Primes,Ref)来“取消优化”它 它起作用了。我见过多个例子,其中每个子句有多个“语句”,但不明白为什么我的语句不起作用 非常感谢 请参见: 有效的保护表达式集(有时称为保护测试)是 有效Erlang表达式集的子集。原因 限制

各位堆垛工人

我目前正在学习二郎。 有人能告诉我为什么我会得到一个
非法的守卫表达式

在长度(素数)==0时添加新素数(Idx,素数,Ref);数学:sqrt(Idx)Ref++[Idx]

如果我在长度(素数)=:=0->Ref++[Idx]时只通过
添加新素数(Idx,Primes,Ref)来“取消优化”它

它起作用了。我见过多个例子,其中每个子句有多个“语句”,但不明白为什么我的语句不起作用

非常感谢

请参见:

有效的保护表达式集(有时称为保护测试)是 有效Erlang表达式集的子集。原因 限制有效表达式集是对保护的求值 表达必须保证没有副作用。有效守卫 表达方式如下:

原子为true,其他常量(项和绑定变量),所有 视为错误,调用以下指定的BIFs,期限 比较、算术表达式、布尔表达式和 短路表达式(andalso/orelse)

在您的例子中,
math:sqrt(Idx)
不是有效的保护表达式


阅读此处的文档:

除了@BlackMamba的答案,惯用的Erlang方法是:

add_new_prime(Idx, [], Ref) -> Ref ++ [Idx];
add_new_prime(Idx, [Prime | Primes], Ref) when Idx < Prime * Prime -> Ref ++ [Idx];
...
add_new_prime(Idx,[],Ref)->Ref++[Idx];
在IdxRef++[Idx]时添加新的素数(Idx[prime | Primes],Ref);
...