次のテスト関数を検討してください。
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 _ を指定したので、MonadError の Binary String 実装を使用します。MonadError の実装を自分で指定しなかった場合、またはこの関数を別の関数から呼び出して型推論を行った場合、エラーが発生すると想定していました。その代わり:
*Main> testError True
*Main> testError False
*** Exception: user error (hello world)
GHCi はある種の「デフォルト」エラーモナドを提供しているように見えます。誰かがここで何が起こっているのか説明できますか?