最近私を悩ませている簡単な質問。Haskellは、偽の値を返したとしても、ブール値を返す関数ですべての等価性テストを実行しますか?
例えば
f a b = ((a+b) == 2) && ((a*b) == 2)
最初のテストがfalseを返した場合、?の後に2番目のテストを実行し&&
ますか?それとも、Haskellはそれをせずに先に進むのに十分怠惰ですか?
最近私を悩ませている簡単な質問。Haskellは、偽の値を返したとしても、ブール値を返す関数ですべての等価性テストを実行しますか?
例えば
f a b = ((a+b) == 2) && ((a*b) == 2)
最初のテストがfalseを返した場合、?の後に2番目のテストを実行し&&
ますか?それとも、Haskellはそれをせずに先に進むのに十分怠惰ですか?
他の言語と同じように短絡する必要があります。Prelude では次のように定義されています。
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
したがって、最初のパラメーターが False の場合、2 番目のパラメーターを評価する必要はありません。
マーティンが言ったように、遅延評価を使用する言語は、すぐに必要とされない値を評価することはありません。Haskell のような怠惰な言語では、無料でショート サーキットが発生します。ほとんどの言語では、|| && および同様の演算子は、回路評価を短絡させるために、言語に特別に組み込む必要があります。しかし、Haskell では遅延評価がこれを不要にします。自分自身を短絡させる関数を定義することもできます:
scircuit fb sb = if fb then fb else sb
この関数は、論理「or」演算子と同じように動作します。|| 方法は次のとおりです || は Haskell で次のように定義されています。
True || _ = True
False || x = x
したがって、あなたの質問に対する具体的な答えを出すには、いいえ。|| の左側が が true の場合、右辺は評価されません。「短絡」する他の演算子については、2 つと 2 つを組み合わせることができます。
遅延評価とは、本当に必要になるまで何も評価されないことを意味します。