我有不同的構造函數的自定義錯誤類型,姑且稱之爲MyError
:避免無意義的聲明例如錯誤
data MyError = ConditionA String | ConditionB String | ConditionC String
的構造分類錯誤的類型,以及字符串提供更多細節。 我想用我的錯誤類型在Either
單子,比如我要像
myFunction :: a -> Either MyError a
內myFunction的功能,我想在MissingH使用maybeToEither
功能從Data.Either.Utils
:
maybeToEither :: MonadError e m => e -> Maybe a -> m a
但ghc告訴我要做到這一點,我必須製作MyError
和Error
的實例。這似乎回落到MonadError
要求m
是一個單子的事實,併爲Either e
單子實例都需要,因爲fail
Error e
:
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
這是我最好的選擇嗎?
爲什麼這是一個荒謬的例子?您告訴GHC如何使用您的類型來存儲錯誤消息,這對我來說似乎很合理。 – jozefg
因爲它有多個構造函數,所以你不能根據對strMsg的調用來選擇正確的構造函數 – mskel