我在一个带有 IO 的单子(monad)变压器中,我想为 Failure 定义我自己的实例.
因为 Failure 已经为 IO 和 MonadTrans 定义了实例,我什至无法构建自己的重叠实例。
据我所知,我还有四个选择:
这有点尴尬,我需要导出我想要更改的所有内容,并重新定义其余部分。
我会将类定义移动到子模块 Control.Failure.Class
你知道还有其他选择吗?你怎么看?
最佳答案
一个 newtype
wrapper 是解决此类问题的标准方法。 GeneralizedNewtypeDeriving
扩展使得从包装的 monad 派生实例变得轻而易举。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- | Your custom monad transformer
newtype YourMonadT e m r =
YourMonadT (EitherT e m r)
-- Easily derive the instances using the GeneralizedNewtypeDeriving
deriving (Functor, Applicative, Monad, MonadIO)
instance Failure e (YourMonadT e m) where
failure = error "TODO: implement me however you want"
关于haskell - 如何规避 Haskell 中的现有实例(失败)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22558289/