Какая реализация GHCi по умолчанию для MonadError? - PullRequest
3 голосов
/ 13 июля 2010

Рассмотрим следующую тестовую функцию:

testError :: (Error e, MonadError e m) => Bool -> m ()
testError True  = return ()
testError False = throwError $ strMsg "hello world"

В приглашении GHCi я могу сделать следующее:

*Main> testError False :: Either String ()
Left "hello world"
*Main> testError True :: Either String ()
Right ()

Поскольку я указал Either String _ в качестве типа выражения,он использует реализацию E либо String MonadError.Я предполагал, что если я сам не укажу реализацию MonadError или не вызову эту функцию из другой функции, допускающей вывод типов, я получу ошибку.Вместо этого:

*Main> testError True
*Main> testError False
*** Exception: user error (hello world)

Может показаться, что GHCi предоставляет какую-то монаду ошибки «по умолчанию».Может кто-нибудь объяснить, что здесь происходит?

1 Ответ

13 голосов
/ 13 июля 2010

Выражения, набранные в приглашении в GHCi, проверяются дважды: сначала они заключаются в print, а если это не удается по какой-либо причине, то как операция ввода-вывода.В вашем случае первая попытка потерпит неудачу из-за неоднозначности, но вторая попытка проверки типов с использованием экземпляра IO MonadError.

...