能够组合不同的 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 = ...
这样我就可以在同一功能中同时foo
使用两者。logit