gpt4 book ai didi

haskell - 结合 ReaderT monad?

转载 作者:行者123 更新时间:2023-12-02 13:41:03 24 4
gpt4 key购买 nike

看来能够组合不同的 ReaderT 环境会很有用。

例如,通用日志记录工具可能如下所示:

logit :: Text -> ReaderT Bool  IO ()
logit str = do debugflag <- ask
liftIO $ if debugflag then putStrLn ("debug: " ++ str) else return ()

这看起来是一个很好的可重用组件。那么我该如何将此定义与另一个 ReaderT 环境集成,以便我可以同时使用它们呢?

例如,假设我想将它与这个 ReaderT 实例结合起来:

foo :: ReaderT Text IO ()
foo = ...

这样我就可以在同一个函数中使用 foologit

最佳答案

您希望将它们分层到一个堆叠的 monad 中,但它们不能堆叠在一起,因为它们都声明 IO 正是包装的 monad。幸运的是,您的代码已经足够通用,可以解除此限制。最常见的函数类型使用 MonadIO,而不是专门使用 IO。如果将类型更改为

 logit :: MonadIO m => Text -> ReaderT Bool m ()
foo :: MonadIO m => ReaderT Text m ()

然后 liftIO 调用会将整个堆栈中的 IO 操作提升到底部的 IO monad。

需要明确的是,您编写的类型不需要使用 liftIO - 相同的类型只需 lift 即可满足,但由于 IO (简单地)是 MonadIO 的一个实例,那么您的(过度)专用类型也将通过检查器。

关于haskell - 结合 ReaderT monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042784/

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