gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:15:29 25 4
gpt4 key购买 nike

我在一个带有 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com