我在使用IO的monad变换器中,我想为Failure定义我自己的实例。
因为Failure已经为IO和MonadTrans定义了实例,所以我甚至无法构建自己的重叠实例。
据我所知,我还有四个选择:
你知道其他选择吗?你觉得怎么样?
答案 0 :(得分:7)
newtype
包装器是解决此类问题的标准方法。 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"