gpt4 book ai didi

haskell - throwE 和 catchE 与 ExceptT monad 在 monadic 堆栈的底部

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

假设我有一个像这样的 monadic 堆栈:

import Control.Monad.Trans.Reader
import Control.Monad.Trans.Except
import Control.Monad.Trans

type MyMonad = ReaderT Env (ExceptT String IO) -- Env is irrelevant

还有一个函数(经过简化,但思路成立):

f :: Integer -> MyMonad Integer
f 42 = lift $ throwE "42 is an ILLEGAL number"
f n = return n

我现在想要做的是从另一个函数调用 f,但是如果抛出的异常发生则捕获它并以某种方式处理它(例如,抛出另一个异常但消息已更改)。我很难弄清楚应该在这里进行什么样的升降机操作才能正确完成。我试过这样的事情:

g n = do
x <- (f n) `catchE'` (\_ -> lift $ throwE "nope, still illegal")
return x
where catchE' - lift . catchE

但这显然行不通,因为 catchE'ExceptT monad 中获取了一些东西,而不是 MyMonad。可以轻松完成吗?也许改变 monad 栈的结构会有帮助?

最佳答案

您需要的不仅仅是lift 来提升catch 通过monad 转换器。事实上,有些转换器根本无法解除catch(例如ContT)。但是对于 ReaderT 来说,最简单的使用方法是通过 mtl 库中的 Control.Monad.Error.catchError

关于haskell - throwE 和 catchE 与 ExceptT monad 在 monadic 堆栈的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55873906/

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