Como lidar com essa exceção?
Pergunta
Haskell está me givinig uma dor de cabeça hoje. Eu quero lidar com uma exceção. Quando se chega ao topo imprime assim:
*** Exceção: ../p/trip/Trip.hs:(88,16)-(89,50): padrões não exaustivas em Split função
Para mim, parece que é PatternMatchFail, mas isso não funciona:
handle (\(PatternMatchFail _) -> return env) f
Quer dizer, ele compila, mas não tratar a exceção. O que estou fazendo de errado? Não é a exceção errado ou o que? Existe uma maneira para capturar qualquer exceção?
Solução
Se fixar a origem do erro não é uma opção, você deve olhar para isto: http://www.haskell.org/ ghc / docs / latest / html / bibliotecas / base / Control-Exception.html
Acredito que o uso de "pega" ou "tentativa" ou "pegar" ou qualquer que seja a partir Control.Exception é a chave aqui, as funções no prelúdio padrão apenas lidar com IO-exceções, não com erros no código puro.
Em Haskell98, código puro não pode lidar com exceções. funções puras deve retornar um valor, uma exceção é um fracasso para retornar um valor.
Exemplo:
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
A chamada para avaliar é forçar a avaliação de x e y, Haskell ser preguiçoso e tudo.
Se você deixar a avaliação de x ser adiada até mais tarde (preguiçosamente), a exceção também será lançada mais tarde, em um lugar diferente (neste caso é "print" que usa o valor), onde não pode ser capturados.