我有一个带有各种构造函数的自定义错误类型,我们称之为MyError
:
data MyError = ConditionA String | ConditionB String | ConditionC String
构造函数对错误类型进行分类,字符串提供更多详细信息。我想在Either
monad 中使用我的错误类型,例如我想要一个函数
myFunction :: a -> Either MyError a
在 myFunction 中,我想使用MissingH 中的maybeToEither
函数: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
这是我最好的选择吗?