Haskellでは短絡(&&)
-
21-09-2019 - |
質問
最近、私を悩ませてきた簡単な質問。 DOES Haskellは一つでも戻り値false場合は、ブール値を返す関数内のすべての等価テストを行いますか?
例
f a b = ((a+b) == 2) && ((a*b) == 2)
最初のテストがfalseを返した場合、、それは&&
後に第2のテストを実行しますか?それとも、それを行うと上に移動しないようにHaskellの怠惰な十分なのですか?
解決
は短いだけで他の言語と同様に短絡されなければなりません。これは、プレリュードでは、次のように定義されています:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
最初のパラメータがFalseの場合、だから、第二を評価する必要はありません。
他のヒント
のようにマーティンは、遅延評価と言語の値がすぐに必要とされていないことを何かを評価することはありません、と述べました。 Haskellのような怠惰な言語では、あなたは自由のための短絡を取得します。ほとんどの言語で、||そして&&と同様の演算子は短絡評価にそのためには言語に特別に構築する必要があります。しかし、Haskellで、遅延評価は、これが不要になります。
:あなたも短絡が自分で関数を定義することができ scircuit fb sb = if fb then fb else sb
この関数は、単に論理的「または」オペレータのように動作します。ここではどのようにある|| Haskellで定義されています:
True || _ = True
False || x = x
だから、あなたの質問にあなたの特定の答えを与えるために、ありません。もし||の左辺真で、右側が評価されることはありません。あなたは「短絡」という他の事業者のための2と2を一緒に置くことができます。
それが本当に必要とされるまで何が評価されていないこと怠惰な評価手段、ます。
所属していません StackOverflow