Erlang多个守卫在`when`

时间:2014-06-17 01:18:26

标签: erlang pattern-guards

研究员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];

“取消优化”它

它有效。我已经看到了多个例子,其中每个条款有多个“语句”但却看不出为什么我的工作不起作用。

非常感谢!

2 个答案:

答案 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];
...
  

The inclusion of length/1 in guard tests has always been more than a bit dodgy. It's better taste to avoid it.