Ich versuche, Fehler in Haskell Fehlerbehandlung zu bekommen. Ich habe den Artikel "8 ways to report errors in Haskell" gefunden, aber ich bin verwirrt, warum Maybe und Eat sich anders verhalten.Haskell: Warum verhalten sich die Typen Maybe und Entweder anders, wenn sie als Monaden verwendet werden?
Zum Beispiel:
import Control.Monad.Error
myDiv :: (Monad m) => Float -> Float -> m Float
myDiv x 0 = fail "My divison by zero"
myDiv x y = return (x/y)
testMyDiv1 :: Float -> Float -> String
testMyDiv1 x y =
case myDiv x y of
Left e -> e
Right r -> show r
testMyDiv2 :: Float -> Float -> String
testMyDiv2 x y =
case myDiv x y of
Nothing -> "An error"
Just r -> show r
testMyDiv2 1 0
ein Ergebnis von "An error"
gibt aufrufen, aber testMyDiv1 1 0
gibt Aufruf:
"*** Exception: My divison by zero
(das Fehlen Schlusskurs Hinweis, was darauf hindeutet dies kein String aber eine Ausnahme).
Was gibt?
Ich bekomme '" Meine Division durch Null "' für 'testMyDiv1 1 0' mit Mtl-1.1.0.2. Welche "Control.Monad.Error" verwendest du? – sepp2k
Wie Sepp2k gesagt hat, hängt es von den 'instance Monad' Deklarationen für' Eat' und 'Maybe' ab. Idealerweise sollten Sie die Instanz-Monade (entweder String) verwenden, die in der letzten Basis verfügbar ist, oder eine von "mtl" oder "monads- {fd, tf}". –
Ich merke, ich bekomme viel "Sie verwenden das alte Paket' base 'Version 3.x. Zukünftige GHC-Versionen werden nicht Basisversion 3.x unterstützen. Sie sollten Ihren Code aktualisieren, um die neue Basisversion 4.x zu verwenden. " Fehler. Also vielleicht ist meine Ghc-Installation veraltet? Kabale Aktualisierung gilt nicht. Ich denke daran, meine Installation zu löschen und neu zu starten. – stusmith