haskell - 提取嵌套 Exception monad 转换器的左值

标签 haskell monads monad-transformers

是否可以创建具有以下签名的函数?

ExceptT A (ExceptT B m) () -> ExceptT B m A

我的想法是这样的,因为 x 是上述函数的参数(而且我很讨厌 monad,所以它很可能是错误的)。

runExceptT x :: ExceptT B m (Either A ())

但是后来我陷入了类似 Either A () -> A 之类的情况,这本质上必须考虑 Right ,因此要么失败,要么返回一些常量A(我没有)。

但是,我知道 x 的原始值正是左侧值之一,因为否则定义会无限循环。

最佳答案

OP 在评论中澄清:

I have some value [x] that is of type ExceptT B m (). That value may be either left or right. However, then I do forever x and then it becomes left at some point (m is StateT) or it never terminates.

问题在于您过早地将结果类型固定为 ()。当您永远运行一个操作时,您会得到您想要的任何结果类型。特别是,您可以将左侧和右侧固定为相同类型,突然之间一切就正常了。也就是说,你可以写类似

either return return =<< runExceptT (forever x)

如果发生异常,您最终会得到一个返回异常的操作。

关于haskell - 提取嵌套 Exception monad 转换器的左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32442639/

相关文章:

haskell cabal +尼克斯 : Generate local documentation for all dependencies in a project

haskell - 嵌套序列到分支/树数据结构

haskell - 使用 unsafeIOToSTM 从数据库读取安全吗?

haskell - 使用读取后不变的参数

haskell - 如何将 (Either String (a -> b)) 映射到 (Either String [(a -> b)])

haskell - 类型声明有什么问题吗?

haskell - 我可以让 Control.Proxy 中的 StateP 成为 MonadState 的实例吗?

haskell - 如何将具有类约束的多个非标准变压器组合成一个堆栈?

haskell - 这个概念在 Haskell 中叫什么?

haskell - 计算期间在环境中隐式携带 STRef