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?

War es hilfreich?

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.

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