Em GHCi:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
Por que o primeiro não é uma exceção aninhada?
Em GHCi:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
Por que o primeiro não é uma exceção aninhada?
erroré especial e não é realmente um mecanismo de exceção. Para exceções reais e captáveis, consulte a Errormônada.
(\f g x -> f (g x)) error error ""se comporta de maneira diferente de (.) error error "", embora essa função seja equivalente a (.). Talvez tenha a ver com os sinalizadores de otimização com os quais o Prelude foi compilado.
iterate error "" !! ne o incrível fix error.
error = errore programo de acordo.
Respostas:
A resposta é que esta é a (um tanto surpreendente) semântica de exceções imprecisas
Quando o código puro pode ser mostrado para avaliar um conjunto de valores excepcionais (ou seja, o valor de errorou undefined, e explicitamente não o tipo de exceções geradas em IO ), então a linguagem permite que qualquer valor desse conjunto seja retornado. Valores excepcionais em Haskell são mais parecidos NaNcom código de ponto flutuante, em vez de exceções baseadas em fluxo de controle em linguagens imperativas.
Uma pegadinha ocasional, mesmo para Haskellers avançados, é um caso como:
case x of
1 -> error "One"
_ -> error "Not one"
Uma vez que o código avalia um conjunto de exceções, o GHC é livre para escolher uma. Com as otimizações ativadas, você pode descobrir que isso sempre é avaliado como "Nenhum".
porque nós fazemos isso? Caso contrário, restringiríamos excessivamente a ordem de avaliação da linguagem, por exemplo, teríamos que fixar um resultado determinístico para:
f (error "a") (error "b")
exigindo, por exemplo, que seja avaliado da esquerda para a direita se houver valores de erro. Muito pouco Haskelly!
Como não queremos prejudicar as otimizações que podem ser feitas em nosso código apenas para dar suporte error, a solução é especificar que o resultado é uma escolha não determinística do conjunto de valores excepcionais: exceções imprecisas! De certa forma, todas as exceções são retornadas e uma é escolhida.
Normalmente, você não se importa - uma exceção é uma exceção - a menos que você se preocupe com a string dentro da exceção, caso em que usar errorpara depurar é altamente confuso.
Referências: Uma semântica para exceções imprecisas , Simon Peyton Jones, Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson. Projeto e implementação de linguagens de programação Proc (PLDI'99), Atlanta. ( PDF )
throw) e com os quais você pode lançar uma exceção de forma determinística throwIO.
case error "banana" of (x:xs) -> error "bonobo"pode dar a você * Exception: bonobo.