ErrorT 已弃用,但 exceptT 不适合

2024-05-09

我有一个一元计算。在某些时候,由于单子模式匹配,它开始需要 MonadFail 约束。

我的简单解决方法是使用以下命令运行它:

fmap (either error id) . runErrorT

然而哎呀:

Deprecated: "Use Control.Monad.Trans.Except instead"

所以看来ErrorT已被弃用,我要使用ExceptT反而。从表面上看这听起来不错,但看起来 exceptT 并不是一个简单的替代品at all!只需查看实例声明:

instance (Monad m, Error e) => MonadFail (ErrorT e m)
instance MonadFail m => MonadFail (ExceptT e m)

ErrorT providesMonadFail 实现。ExceptT merely lifts it.

我不太确定从现在开始该往哪里走。

  • 我的代码最终根本不会有可反驳的绑定。这是静态已知可以工作但尚未向类型检查器证明的情况之一。我会到达那里,但需要一段时间。 (比如,我需要依赖类型,所以我需要学习依赖类型。这需要一段时间。)

  • 但与此同时,我的代码需要绑定,而且我真的很满意error如果我搞砸了就会被叫。

看来我正在寻找的是一些通用的MonadFail实现允许我......好吧,在模式无法匹配的情况下做我想做的事。ErrorT做了这个,并且ExceptT没有。

我的未弃用选项有哪些?


这个问题问得好!我什至写了一个实际的库FailT https://github.com/lehins/FailT解决了优雅失败的问题MonadFail.

我不确定确切的设置是什么,但我想用一个具体的例子来回答这个问题。假设我们有一个一元动作,它接受另一个一元动作,该动作产生MyType我们可以打赌我们的家庭农场将是Expected case:

data MyType a = Expected a | Unexpected a
  deriving (Show)

myFunc :: (Show a, MonadFail m) => m (MyType a) -> m String
myFunc t = do
  Expected a <- t
  pure $ show a

不幸的是没有合适的解决方案base或其他与 GHC 连接的库,例如transformers or mtl例如。

就像你已经知道的那样ErrorT本来可以完美地解决这个问题,但出于充分的理由,它被弃用了。

ExceptT本来可以提供一个明智的MonadFail例如,但这对于向后兼容性来说是一个很大的问题。

正如评论中所建议的那样ExceptT with a newtype并提供定制MonadFail实例当然可以工作,但是谁希望每次遇到这个问题时都将其包含在代码库中。为了完整起见,这里是一个最小的独立解决方案:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Control.Monad.Trans.Except

newtype ResultT m a = ResultT (ExceptT String m a)
  deriving (Functor, Applicative, Monad)

instance Monad m => MonadFail (ResultT m) where
  fail = ResultT . throwE

runResultT :: ResultT m a -> m (Either String a)
runResultT (ResultT m) = runExceptT m

当然,还可以派生出更多实例,但不是全部。Alternative and MonadPlus有丑陋的行为。

无论如何,这是一个足够常见的问题,需要有适当的可重用解决方案来解决。这是可以使用以下方法处理的方法FailT https://hackage.haskell.org/package/FailT-0.1.1.0/docs/Control-Monad-Trans-Fail-String.html#t:FailT单子变压器:

λ> import Control.Monad.Trans.Fail.String (runFailT)
λ> runFailT (myFunc (pure (Expected "Totally fine")))
Right "\"Totally fine\""
λ> runFailT (myFunc (pure (Unexpected "Surprise!")))
Left "Pattern match failure in 'do' block at /home/lehins/github/public/haskell/stackoverflow/errort-is-deprecated-but-exceptt-doesnt-fit/src/Lib.hs:25:3-12"

对于任何对这个主题感兴趣的人,我还写了一篇关于它的完整博客文章:上课不及格 https://alexey.kuleshevi.ch/blog/2023/01/16/fail-with-class/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ErrorT 已弃用,但 exceptT 不适合 的相关文章

  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 关于“没有绑定的类型签名”的错误

    我在 Haskell 中遇到 ASCII 问题 fromEnum Char gt Int toEnum Int gt Char offset Int offset fromEnum A fromEnum a toUpper Char gt
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • 为什么在 where 子句中使用类型签名如此罕见?

    它是否有助于编译器优化 或者只是添加额外类型签名的多余工作 例如 人们经常看到 foo a gt b foo x bar x where bar x undefined 而不是 foo a gt b foo x bar x where ba
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • Control.Parallel.Strategies 中 Eval 的绑定运算符如何严格评估其参数?

    Control Parallel Strategies 的源代码 http hackage haskell org packages archive parallel 3 1 0 1 doc html src Control Paralle
  • Haskell 处理负参数

    尝试对两个值求和 其中只有一个为负值 例如 1 and 2 soma Float gt Float gt Float soma x1 x2 x1 x2 结果出现错误 为什么
  • Haskell:对 Num 类型类的使用感到困惑

    我很困惑为什么这有效 f Num a gt a gt a f x x 42 但这并没有 g Num a gt a gt a g x x 4 2 我本来就明白Num包含实现运算符的所有类型 因此 如果42 is an Int and 4 2
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell Fibonacci 达到最大指定数?

    我有一个已启动并正在运行的 Haskell 函数 但它做错了事情 它应该输出最多指定最大数量的斐波那契数列 像这样 fibonacciSequence 86 1 1 2 3 5 8 13 21 33 54 我的代码当前输出斐波那契数列中的前
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • 我可以从 GHCi 中找到 GHC 版本吗?

    gt 我在里面输入什么GHCi发现它正在使用哪个 GHC 版本 gt import System Info gt browse arch String compilerName String compilerVersion Data Ver
  • 由于垃圾收集,Haskell 程序中会出现多长时间的暂停?

    关于我的另一个问题Haskell 集合可以保证每个操作的最坏情况范围 https stackoverflow com q 12393104 1333025 我很好奇 垃圾收集会导致多长时间的暂停 Haskell 是否使用某种增量垃圾收集 以
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali
  • 在ghci中,如何删除现有的绑定?

    我收到一个 绑定影响现有绑定 错误 类似于以下错误this https stackoverflow com questions 2902716 in haskell what does it mean if a binding shadow
  • Cabal 无法安装依赖项,但如果直接询问可以安装它们

    我发现 Cabal 反复出现一个非常奇怪的问题 它影响了我获得可重复的 Haskell 构建的能力 我有一个带有沙箱的阴谋集团项目 如果我做cabal install 我收到以下形式的错误 Y failed during the build
  • 不同类型的列表?

    data Plane Plane point Point normal Vector Double data Sphere Sphere center Point radius Double class Shape s where inte

随机推荐

  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • Swift 将十进制坐标转换为度、分、秒、方向

    我怎样才能将其转换为快速 我最好的猜测是所有 int 都变成了 var 删除所有导致 的 此外 如果有的话可以给我指出一个很好的来源来了解事物如何转换 那就太好了 NSString coordinateString int latSecon
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 使用后代选择器的响应式网站

    我试图使用媒体查询使我的网站响应 但是当我在代码的某些部分使用后代选择器时 页面没有响应 当我使用此代码时 该页面是响应式的 div1 float left width 20 height 200px background color re
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 如何获取模板的所有实例?

    我知道我可以通过这样做获得一个模板实例Blaze getView node 但我怎样才能找到所有实例Template foo 如果我们借行走DOM http www javascriptcookbook com article Traver
  • 如何在 Javascript 中将字符串数组转换为特定的树结构

    我从后端获取文件路径列表 它代表文件夹结构 如下所示 paths path to file1 doc path to file2 doc foo bar doc 路径的长度是任意的 为了使用文件树组件 角度2树组件 https github
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • WPF 路径:如何在 XAML 中绘制它?

    我想创建一个带有非矩形标题的自定义 GroupBox 如下图所示 正如你所看到的 标题的内容必须是可参数化的 因此可以在xaml中输入图像 标题和背景 提前致谢 谢谢您的回答 实际上我想在自定义组框中使用这个设计 所以在你的答案中 如果我不
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • 使用 Core Data Swift 对 TableView 和行进行分区

    我在 sqlite 中有两个表 代码由 XCode Generation 生成 class Event NSManagedObject NSManaged var startDate NSDate NSManaged var details
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • 用户非超级管理员和大对象的 pg_dump

    我与非超级管理员的用户开始了导出数据库的长期职业生涯 但我发现了一个问题 在新版本的postgresql中只有超级管理员才能访问大对象 ERROR permission denied for large object 5141 没有办法做到
  • 正则表达式检查确切的字符串是否存在,包括#

    新问题正如 Asaph 在上一个问题中所建议的 正则表达式检查确切的字符串是否存在 https stackoverflow com questions 2824291 regex to check if exact string exist
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • 使用java将数据从Neo4j导出到csv

    将数据从 Neo4j 导出到 CSV 的最佳方法是什么 我已使用链接中的 CSV 导入器将数据从 csv 导入到 neo4jhttps github com sroycode neo4j import https github com sr
  • /bootstrap/start.php 中的 Laravel 错误:\Illuminate\Foundation\Application 未找到

    因此 我在开发服务器上安装了 Laravel php5 5 3 标准安装 安装了 mcrypt 并收到以下错误消息 Fatal error Class Illuminate Foundation Application not found
  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control