看起来,能够组合不同的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
。