Gibt es eine Garantie für die Auswertungsreihenfolge innerhalb einer Musterübereinstimmung?

Folgend

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

hat die gewünschte KurzschlusseigenschaftFalse && undefined ≡ False. Die erste Klausel, die im richtigen Argument nicht streng ist, wird garantiert überprüft, bevor etwas anderes versucht wird.

Anscheinend funktioniert es immer noch, wenn ich die Reihenfolge ändere und sogar die Funktion öffne

both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False

Prelude> both (False, undefined)
False

aber ist das eigentlich durch den standard garantiert? Anders als bei der Reihenfolge der Klauseln ist hier die Reihenfolge der Bewertung der Muster nicht so klar. Kann ich eigentlich sicher sein, dass passende(True,False) wird abgebrochen sobald(False,_) wird bestimmt, bevor das snd-Element überhaupt ausgewertet wird?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage