Haskellのエラーを処理するために次のモナド変換子があります。
instance (Monad m, Error e) => Monad (EitherT e m) where
return = EitherT . return . return
m >>= k = EitherT $ do
a <- runEitherT m
case a of
Left l -> return (Left l)
Right r -> runEitherT (k r)
fail = EitherT . return . Left . strMsg
Error
カスタムクラスでインスタンス化でき、エラーを処理するための非常に柔軟な手段があるため、かなりうまく機能します。
fail
ただし、これはタイプString -> EitherT e m
であり、String
制限がエラーを作成するための厄介な方法になる可能性があるため、少しばかげています。私はたくさんのことになります:
instance Error BazError where
strMsg "foo" = FooError -- oh look we have no error context
strMsg "bar" = BarError -- isn't that nice
私がやりたいのは、制限を取り除くことができるようにfail
、タイプのような新しい関数を作成することです。モナドスタックが大きくなったとき、たとえばa -> e
(Error e)
fail
EitherT BazError (StateT [BazWarning] IO) Foo
fail
制限の少ないタイプと同じ動作をする関数を作成する方法はありますか?またはfail
、ディープハスケルダークマジックを使用して実装されていますか?