異なる 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