4

仲間のスタックオーバーフロー担当者、

私は現在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

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 に答える