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);
...