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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top