4

各位 stackoverflow 人,

我目前正在学习 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];

有用。我见过多个示例,其中每个子句有多个“声明”,但看不出为什么我的不工作。

非常感谢!

4

2 回答 2

7

请参见:

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

原子为真,其他常量(项和绑定变量)都被视为假,调用下面指定的 BIF,项比较、算术表达式、布尔表达式和短路表达式(andalso/orelse)。

在您的情况下,math:sqrt(Idx)不是有效的保护表达式。

在此处阅读文档:http ://www.erlang.org/doc/reference_manual/expressions.html#id81357

于 2014-06-17T02:17:56.953 回答
3

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

add_new_prime(Idx, [], Ref) -> Ref ++ [Idx];
add_new_prime(Idx, [Prime | Primes], Ref) when Idx < Prime * Prime -> Ref ++ [Idx];
...

在警卫测试中包含 length/1 总是有点狡猾。避免它的味道更好。

于 2014-06-17T08:50:50.873 回答