Kurzschlüsse (&&) in Haskell
-
21-09-2019 - |
Frage
Eine kurze Frage, die mich in letzter Zeit wurde abgehört. Does Haskell führen alle Äquivalenzprüfung in einer Funktion, die gibt einen Booleschen, auch wenn man zurückkehrt ein falscher Wert?
Zum Beispiel
f a b = ((a+b) == 2) && ((a*b) == 2)
Wenn der erste Test false zurückgibt, wird es den zweiten Test nach dem &&
durchführen? Oder ist Haskell faul genug, um es nicht zu tun und weitergehen?
Lösung
sollte kurz sein geschlossen wie andere Sprachen. Es ist wie dies im Prelude definiert:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
Also, wenn der erste Parameter Falsch ist die zweite muss nie ausgewertet werden.
Andere Tipps
Wie Martin sagte, Sprachen mit lazy evaluation bewerten nie etwas, dass der Wert nicht sofort benötigt wird. In einer faulen Sprache wie Haskell, erhalten Sie Kurzschlüsse kostenlos. In den meisten Sprachen, die || und && und ähnliche Betreiber müssen speziell in die Sprache, um für sie zu Kurzschlussauswertung aufgebaut werden. Doch in Haskell, macht faul Auswertung dieses nicht notwendig. Sie könnten eine Funktion, die Kurzschlüsse definieren sich selbst:
scircuit fb sb = if fb then fb else sb
Diese Funktion verhalten sich wie die logische ‚oder‘ Operator. Hier ist, wie || definiert ist, in Haskell:
True || _ = True
False || x = x
Also, Ihnen die spezifische Antwort auf Ihre Frage zu geben, nein. Wenn die linke Seite des || wahr ist, wird die rechte Seite nie ausgewertet. Sie können für die anderen Betreiber zwei und zwei zusammen, dass ‚Kurzschluss‘.
Verzögerte Auswertung bedeutet, dass nichts ausgewertet wird, bis es wirklich benötigt wird.