3

次のテスト関数を検討してください。

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 はある種の「デフォルト」エラーモナドを提供しているように見えます。誰かがここで何が起こっているのか説明できますか?

4

1 に答える 1

13

GHCi のプロンプトで入力された式は、2 回型チェックされます。最初は でラップされprint、何らかの理由で失敗した場合は IO 操作として行われます。あなたの場合、最初の試行はあいまいさのために失敗しますが、2 回目の試行は のIOインスタンスを使用して型チェックしますMonadError

于 2010-07-13T15:27:01.027 に答える