Estoy tratando de entender el manejo de errores en Haskell. Encontré el artículo "8 ways to report errors in Haskell" pero estoy confundido sobre por qué Maybe y Oither se comportan de manera diferente.Haskell: ¿Por qué los tipos Maybe y Either se comportan de manera diferente cuando se usan como Monads?
Por ejemplo:
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
Calling testMyDiv2 1 0
da un resultado de "An error"
, pero llamar testMyDiv1 1 0
da:
"*** Exception: My divison by zero
(Tenga en cuenta la falta de cotización de cierre, lo que indica que esto no es una cadena, pero una excepción).
¿Qué ofrece?
Obtengo '" Mi división por cero "' para 'testMyDiv1 1 0' usando mtl-1.1.0.2. ¿Qué 'Control.Monad.Error' estás usando? – sepp2k
Como dijo sepp2k, depende de las declaraciones 'instancia Monad' para 'Oither' y' Maybe'. Idealmente, debería usar la 'instancia Monad (Either String)' disponible en la base más reciente o una de 'mtl' o' mónadas- {fd, tf} '. –
Me di cuenta de que obtengo un montón de "Estás utilizando la versión anterior de la base del paquete 3.x. Las versiones futuras de GHC no admitirán la versión base 3.x. Debes actualizar tu código para usar la nueva versión base 4.x." errores Entonces, ¿mi instalación ghc está desactualizada? actualización cabal no aplica nada. Estoy pensando en destruir mi instalación y comenzar de nuevo. – stusmith