Рассмотрим следующую тестовую функцию:
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 предоставляет какую-то монаду ошибки «по умолчанию».Может кто-нибудь объяснить, что здесь происходит?