Die Antwort ist, dass dies die (etwas überraschende) Semantik von ist ungenauer Ausnahmen ist
Wenn gezeigt werden kann, dass reiner Code zu einer Reihe von Ausnahmewerten ausgewertet wird (dh der Wert von error
oder undefined
und explizit nicht die Art der in IO generierten Ausnahmen ), ermöglicht die Sprache die Rückgabe eines beliebigen Werts dieser Menge. Außergewöhnliche Werte in Haskell sind eher ähnlichNaN
Gleitkomma-Code als auf Kontrollfluss basierenden Ausnahmen in imperativen Sprachen.
Ein gelegentliches Problem für fortgeschrittene Haskeller ist ein Fall wie:
case x of
1 -> error "One"
_ -> error "Not one"
Da der Code eine Reihe von Ausnahmen ergibt, kann GHC eine auswählen. Wenn Optimierungen aktiviert sind, wird dies möglicherweise immer als "Nicht einer" ausgewertet.
Warum machen wir das? Weil wir sonst die Bewertungsreihenfolge der Sprache übermäßig einschränken würden, z. B. müssten wir ein deterministisches Ergebnis festlegen für:
f (error "a") (error "b")
indem beispielsweise verlangt wird, dass es von links nach rechts ausgewertet wird, wenn Fehlerwerte vorhanden sind. Sehr un-Haskelly!
Da wir die Optimierungen, die an unserem Code vorgenommen werden können, nicht nur zur Unterstützung lähmen wollen error
, besteht die Lösung darin, anzugeben, dass das Ergebnis eine nicht deterministische Auswahl aus dem Satz außergewöhnlicher Werte ist: ungenaue Ausnahmen! In gewisser Weise werden alle Ausnahmen zurückgegeben und eine ausgewählt.
Normalerweise ist es Ihnen egal - eine Ausnahme ist eine Ausnahme - es sei denn, Sie interessieren sich für die Zeichenfolge in der Ausnahme. In diesem Fall ist die Verwendung error
zum Debuggen sehr verwirrend.
Referenzen: Eine Semantik für ungenaue Ausnahmen , Simon Peyton Jones, Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson. Entwurf und Implementierung von Proc-Programmiersprachen (PLDI'99), Atlanta. ( PDF )