Pregunta

Haskell me está dando un dolor de cabeza hoy. Quiero manejar una excepción. Cuando llega a la parte superior, se imprime así:

*** Excepción: ../p/trip/Trip.hs:(88,16)-(89,50): patrones no exhaustivos en la división de funciones

Para mí, parece que es PatternMatchFail, pero esto no funciona:

handle (\(PatternMatchFail _) -> return env) f

Quiero decir, se compila, pero no maneja la excepción. ¿Qué estoy haciendo mal? ¿Es esta la excepción equivocada o qué? ¿Hay alguna forma de atrapar alguna excepción?

¿Fue útil?

Solución

Si corregir la fuente del error no es una opción, debe mirar esto: http://www.haskell.org/ ghc / docs / latest / html / library / base / Control-Exception.html

Creo que usando " manejar " o " prueba " o " captura " o lo que sea de Control.Exception es la clave aquí, las funciones en el preludio estándar solo tratan con Excepciones IO, no con errores en código puro.

En Haskell98, el código puro no puede hacer frente a las excepciones. Las funciones puras deben devolver un valor, una excepción es una falla al devolver un valor.

Ejemplo:

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

El llamado a evaluar es forzar la evaluación de x e y, haskell es perezoso y todo.

Si deja que la evaluación de x se aplace hasta más tarde (perezosamente), la excepción también se lanzará más tarde, en un lugar diferente (en este caso es " imprimir " que usa el valor), donde no puede ser atrapado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top