是否可以创建具有以下签名的函数?
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 typeExceptT B m ()
. That value may be either left or right. However, then I doforever x
and then it becomes left at some point (m
isStateT
) or it never terminates.
问题在于您过早地将结果类型固定为 ()
。当您永远
运行一个操作时,您会得到您想要的任何结果类型。特别是,您可以将左侧和右侧固定为相同类型,突然之间一切就正常了。也就是说,你可以写类似
either return return =<< runExceptT (forever x)
如果发生异常,您最终会得到一个返回异常的操作。
关于haskell - 提取嵌套 Exception monad 转换器的左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32442639/