Wie diese Ausnahme behandeln?
Frage
Haskell givinig mir Kopfschmerzen heute. Ich möchte eine Ausnahme behandeln. Wenn es an die Spitze bekommt druckt es wie folgt aus:
*** Ausnahme: ../p/trip/Trip.hs:(88,16)-(89,50): Nicht erschöpfende Muster in Funktion Split
Für mich sieht es aus wie es PatternMatchFail ist, aber das funktioniert nicht:
handle (\(PatternMatchFail _) -> return env) f
Ich meine, es kompiliert, aber nicht die Ausnahme nicht verarbeiten. Was mache ich falsch? Ist dies die falsche Ausnahme, oder was? Gibt es eine Möglichkeit, jede Ausnahme zu fangen?
Lösung
Wenn die Quelle des Fehlers Fixierung nicht möglich ist, sollten Sie folgendermaßen aussehen: http://www.haskell.org/ ghc / docs / latest / html / Bibliotheken / base / Steuerungs-Exception.html
Ich glaube, mit „Griff“ oder „versuchen“ oder „fangen“ oder was auch immer von Control.Exception ist hier der Schlüssel, die Funktionen im Standard-Auftakt nur mit IO-Ausnahmen, nicht mit Fehlern in reinem Code befassen.
In Haskell98 kann reines Code nicht mit Ausnahmen behandeln. Reine Funktionen muss einen Wert zurückgeben, eine Ausnahme ein Fehler ist, einen Wert zurück.
Beispiel:
import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"
main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
C.handle (\_ -> return "caught") (C.evaluate y) >>= print
Der Aufruf zu bewerten ist die Auswertung von x zu zwingen, und y, Haskell faul und alle.
Wenn Sie lassen die Auswertung von x bis später (träge) aufgeschoben werden, die Ausnahme wird auch später geworfen werden, an einem anderen Ort (in diesem Fall ist es „Druck“, der den Wert verwendet), wo es nicht sein kann, gefangen.