研究员stackoverflow-ers,
我正在学习Erlang。
有人能指出我为什么会得到illegal guard expression
这个警卫?
add_new_prime(Idx, Primes, Ref) when length(Primes) =:= 0 ; math:sqrt(Idx) < hd(Primes) -> Ref ++ [Idx];
如果我仅通过add_new_prime(Idx, Primes, Ref) when length(Primes) =:= 0 -> Ref ++ [Idx];
它有效。我已经看到了多个例子,其中每个条款有多个“语句”但却看不出为什么我的工作不起作用。
非常感谢!
答案 0 :(得分:7)
请参阅:
有效保护表达式(有时称为保护测试)的集合是a 有效Erlang表达式集的子集。的原因 限制有效表达式的集合是对警卫的评估 必须保证表达没有副作用。有效的守卫 表达式是:
原子为真,其他常数(术语和界限变量),全部 被视为虚假,要求下面指定的BIF,期限 比较,算术表达式,布尔表达式和 短路表达(andalso / orelse)。
在您的情况下,math:sqrt(Idx)
不是有效的保护表达式。
请阅读此处的文档:http://www.erlang.org/doc/reference_manual/expressions.html#id81357
答案 1 :(得分:3)
除了@ BlackMamba的回答,惯用的Erlang方法是:
add_new_prime(Idx, [], Ref) -> Ref ++ [Idx];
add_new_prime(Idx, [Prime | Primes], Ref) when Idx < Prime * Prime -> Ref ++ [Idx];
...