gpt4 book ai didi

haskell - 将错误适应于异常(exception)

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

现在 Control.Monad.Error已弃用,Control.Monad.Except至高无上,网上很多资源都没有 catch ,还在展示如何使用的例子Error .

那我要怎么转

instance Error MyError where
noMsg = ...
strMsg = ...

使用 Except .只是替换 ErrorExcept不是 Except需要额外的类型参数

我知道 Except 中不存在这些确切的方法。 ,那么有什么选择呢?

最佳答案

简短的回答是:替换 Error什么都没有,替换ErrorT通过 ExceptT ,只要您不使用 Error,一切都会继续进行。 s 方法,fail (现在有不同的定义),或者 do 中的模式匹配失败符号。

与老Control.Monad.Error的本质区别|系统和新的Control.Monad.Except system 是新系统对错误/异常类型没有类限制。

发现使用任何错误/异常类型的能力,多态,比自定义字符串错误消息转换的有点hacky的能力更有用。

所以类Error简直消失了。

作为副作用,fail对于 ExceptT now 是从底层的 monad 中提取出来的。这也改变了 do 中失败模式的影响。符号。

旧的定义是:

fail msg = ErrorT $ return (Left (strMsg msg))

我认为这相当于
fail msg = throwError (strMsg msg)

如果您仍然需要此行为,则可以改用
throwError yourIntendedErrorValue

(如果您使用 throwE (即 transformers )而不是 Control.Monad.Trans.Except ,则 mtl 起作用。)

do模式匹配失败将适用于诸如
do
Just x <- myErrorTAction
...

当操作实际返回 Nothing .这更尴尬,但你可以例如用明确的 case 替换它匹配(基本上是脱糖):
do
y <- myErrorTAction
case y of
Nothing -> throwE ...
Just x -> do
...

@DanielWagner 建议以下内容以避免额外的缩进:
do
x <- myErrorTAction >>= maybe (throwError ...) return
...

删除 Error也消除了对 Control.Monad.Error 的命名不一致的需要。有:大多数变形金刚遵循 SomethingT 的规则。是变压器的名称, SomethingSomethingT ... Identity 的类型别名.老 ErrorT打破了它,因为 Error类被用于完全不同的东西。

在新系统中, Except e = ExceptT e Identity ,就像其他变压器一样。

关于haskell - 将错误适应于异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221410/

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