さまざまなコンストラクターを持つカスタムエラータイプがあります。それを呼び出しましょうMyError
:
data MyError = ConditionA String | ConditionB String | ConditionC String
コンストラクターはエラーの種類を分類し、文字列は追加の詳細を提供します。モナドでエラータイプを使用しEither
たい、例えば次のような関数が欲しい
myFunction :: a -> Either MyError a
maybeToEither
myFunction 内で、MissingH の関数を使用したいData.Either.Utils
:
maybeToEither :: MonadError e m => e -> Maybe a -> m a
MyError
しかし、ghc は、これを行うには、作成してインスタンス化する必要があると教えてくれますError
。これは、 がモナドである必要があり、 のモナド インスタンスが次の理由でMonadError
必要であるという事実に帰着するようです。m
Either e
Error e
fail
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
それが私の最良の選択肢ですか?