さまざまなコンストラクターを持つカスタムエラータイプがあります。それを呼び出しましょうMyError:
data MyError = ConditionA String | ConditionB String | ConditionC String
コンストラクターはエラーの種類を分類し、文字列は追加の詳細を提供します。モナドでエラータイプを使用しEitherたい、例えば次のような関数が欲しい
myFunction :: a -> Either MyError a
maybeToEithermyFunction 内で、MissingH の関数を使用したいData.Either.Utils:
maybeToEither :: MonadError e m => e -> Maybe a -> m a
MyErrorしかし、ghc は、これを行うには、作成してインスタンス化する必要があると教えてくれますError。これは、 がモナドである必要があり、 のモナド インスタンスが次の理由でMonadError必要であるという事実に帰着するようです。mEither eError efail
instance (Error e) => Monad (Either e) where
return = Right
Left l >>= _ = Left l
Right r >>= k = k r
fail msg = Left (strMsg msg)
Errorでは、無意味なインスタンス宣言を避けるにはどうすればよいMyErrorでしょうか。
Database.MongoDB.Queryの作成者がデータ型に同じ問題を抱えていることに気付きましたFailure(これには複数のコンストラクターがあるため、適切なインスタンスがありません)。彼らの解決策は、の使用をエラーとしてError扱うことでした。fail
instance Error Failure where strMsg = error
それが私の最良の選択肢ですか?