【发布时间】:2016-04-20 19:45:46
【问题描述】:
我无法处理以下问题:
我有一些函数,返回 foo :: a -> b -> ErrorT String IO Int
我知道它返回IO (Either String Int)。
不过,我还有更复杂的函数,返回:
bar :: a -> b -> StateT Char (ReaderT Char (ErrorT String IO)) Int
此函数bar 调用函数foo。我将要做以下事情:
如果 foo 调用 throwError bar 也会抛出相同的错误。如果foo 返回Int bar 也返回Int。
但是,这可能是由于类型不匹配。
我不知道如何以优雅的方式做到这一点。 我认为我的转换器单子顺序不正确。
【问题讨论】:
-
能否请您在
bar内调用foo- 您可能只需要正确的lift 吗? -
是的,非常感谢。我使用了
lift $ lift $,编译器接受了它。我不知道 - 我以为电梯会自动完成。 -
这会让使用 monad-stacks 变得更容易 ;) - 但没关系 - 也许你想写下你自己的答案或在问题为你解决后关闭它
-
不使用具体类型,使用
MonadState、MonadReader和MonadError可能更有意义——这样您就不必使用lift。