如何绕过Haskell中的现有实例(for Failure)?

Seb*_*ner 5 haskell monad-transformers

我在IO的monad变换器中,我想为Failure定义我自己的实例.

因为Failure已经为IO和MonadTrans定义了实例,所以我甚至无法构建自己的重叠实例.

据我所知,我还有四个选择:

  1. Newtyping IO:
    这有点尴尬,我需要得出我想要改变的所有内容,并重新定义其余部分.
  2. 黑客未能将类本身分成它自己的模块:
    我将类定义移动到子模块Control.Failure.Class
  3. 在不重新导出实例的情况下为Failure创建一个简单的包装器模块
  4. 从Monad Transformer中删除MonadTrans

你还知道其他选择吗?你怎么看?

Nik*_*kov 7

一个newtype包装是标准的做法,以这样的问题.的GeneralizedNewtypeDeriving扩展使得任选导出从包裹单子实例轻而易举.

{-# 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"
Run Code Online (Sandbox Code Playgroud)