haskell - 如何规避 Haskell 中的现有实例(失败)?

标签 haskell monad-transformers

我在一个带有 IO 的单子(monad)变压器中,我想为 Failure 定义我自己的实例.

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

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

  • 新类型 IO:
    这有点尴尬,我需要导出我想要更改的所有内容,并重新定义其余部分。
  • 黑客未能将类本身分离到它自己的模块中:
    我会将类定义移动到子模块 Control.Failure.Class
  • 为失败创建一个简单的包装器模块而​​不重新导出实例
  • 从我的 Monad 变压器中删除 MonadTrans

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

    最佳答案

    一个 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/

    相关文章:

    haskell - 我不明白 :t for fromIntegral

    haskell - VTY-UI需要IO。我能让这件事发生吗?

    haskell - 为什么 ContT 不能成为 MonadError 的实例?

    haskell - 定义自制 monad 变压器的绑定(bind)

    Haskell monads 和不需要字符串的失败

    haskell - 为什么 Haskell 管道 "use () to close unused inputs and X (the uninhabited type) to close unused outputs"?

    haskell - 使用一些 `unsafeCoerce` 用例避免 `Coercible`

    haskell - 我们如何与具有 2 种不同错误类型的 2 个 MonadError 约束交互?

    haskell - 在加速中调整大小

    list - 在列表中的元素之间添加零?