14

私はLearnYouSomeErlangウェブブックからErlangを学んでいます。学習中に私を殴ったことの1つは、短絡していないブール論理演算子とディスジョイント演算子です。 andおよびorである。これらの演算子の使用例は何ですか?なぜあなたはandalsoorelseの代わりにそれらを使用したいですか?Erlangで非短絡ブール演算子を使用することは何ですか?

+0

これはPrologのErlangの起源と関係があると言われたので、「Logic Programming」とタグ付けされました。 – missingfaktor

+0

関連:[ガードテストで 'andalso'に'と 'を好むべきときは(http://stackoverflow.com/questions/6025132/when-to-prefer-and-over-andalso-in-guard-tests)。 – kay

答えて

12

以前は、andalsoorelseはテール再帰的ではありませんでした(R13Aまで)。詳細は、http://www.erlang.org/eeps/eep-0017.htmlを参照してください。私は、and/or新しいプログラムに使用する正当な理由はないと思います。

+0

興味深いリンク。答えをありがとう! – missingfaktor

4

演算子は、はるかに古いものです。 andalso/orelse演算子は後で追加されます。今日のユースケースは、いくつかの単純なブール演算を実行したいときや、マシンサイクルの数を節約するよりも水平スペースが重要な場合です。たとえば:

X = Y and (A or B), 

ではなく

X = Y andalso (A orelse B), 

は目に少し簡単です。

下位互換性の理由から、元の動作を変更したり、ショートしたりすることができなかったため、新しいキーワードが必要でした。 andalso/orelseという名前はStandard MLから来ています。

5

私は別のことをやってそれらを参照してください、そのようにそれらを使用する:私は論理値を比較する論理演算子として

  • and/orを。彼らは厳格なので、私は自動的にタイプチェックを取得し、私はKNOW何が呼ばれているかを正確に取得します。 C.
  • andalso/&&のような多くの制御のためのorelse、および||

見てエラーが、私は実行されたかを知る良い感じErlangで定義されており、それがどのように行ってきました。

+0

1. 'andalso'と' orelse'も論理演算子として使用できます。私はタイプチェックについて少しは理解していませんでした。 3.何が呼び出されたかを知ることは、参考に透明な表現では問題ではない。それは副作用の文脈においてのみ関連している。 – missingfaktor

+0

ロバートが言っていることは、述語の評価に必要ない場合でも例外を発生させるために、すべてのオペランドを評価することが時々必要になるということです。それは良い点です。 – dsmith

+0

@dsmith:はい、両方とも、そしてそれらが実際にブール値を返すかどうかをチェックします。私はおそらく過度に慎重であるかもしれませんが、できるだけ早くエラーをキャッチすることは良いことです。 – rvirding

関連する問題