20

最近私を悩ませている簡単な質問。Haskellは、偽の値を返したとしても、ブール値を返す関数ですべての等価性テストを実行しますか?

例えば

f a b = ((a+b) == 2) && ((a*b) == 2)

最初のテストがfalseを返した場合、?の後に2番目のテストを実行し&&ますか?それとも、Haskellはそれをせずに先に進むのに十分怠惰ですか?

4

4 に答える 4

24

他の言語と同じように短絡する必要があります。Prelude では次のように定義されています。

(&&)                    :: Bool -> Bool -> Bool
True  && x              =  x
False && _              =  False

したがって、最初のパラメーターが False の場合、2 番目のパラメーターを評価する必要はありません。

于 2009-11-22T15:01:38.600 に答える
5

マーティンが言ったように、遅延評価を使用する言語は、すぐに必要とされない値を評価することはありません。Haskell のような怠惰な言語では、無料でショート サーキットが発生します。ほとんどの言語では、|| && および同様の演算子は、回路評価を短絡させるために、言語に特別に組み込む必要があります。しかし、Haskell では遅延評価がこれを不要にします。自分自身を短絡させる関数を定義することもできます:

scircuit fb sb = if fb then fb else sb

この関数は、論理「or」演算子と同じように動作します。|| 方法は次のとおりです || は Haskell で次のように定義されています。

True  || _ = True
False || x = x

したがって、あなたの質問に対する具体的な答えを出すには、いいえ。|| の左側が が true の場合、右辺は評価されません。「短絡」する他の演算子については、2 つと 2 つを組み合わせることができます。

于 2009-11-22T21:36:55.350 に答える
0

遅延評価とは、本当に必要になるまで何も評価されないことを意味します。

于 2009-11-22T15:06:26.090 に答える