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