私はモジュール式のプログラム設計を考え出そうとしており、もう一度、あなたの助けをお願いします。
これらの次の投稿のフォローアップとして、 Monad Transformers と Haskell でのパラメーターと大規模な設計の受け渡し、Monad Transformers を使用するが Monad に依存しない関数を公開する 2 つの独立したモジュールを構築してから、それぞれの Monad に依存しない関数を結合しようとしています。これらのモジュールを新しい Monad に依存しない関数に変換します。
mainProgram
結合関数を実行できませんでした。たとえば、以下の例でusingを呼び出すにはどうすればよいrunReaderT
ですか?
副次的な質問は、同じモジュール設計の目標を達成するためのより良い方法はありますか?
この例には 2 つのモック モジュール (ただしコンパイル) があり、1 つはログ記録を実行し、もう 1 つはユーザー入力を読み取って操作します。結合関数は、ユーザー入力を読み取り、ログに記録して出力します。
{-# LANGUAGE FlexibleContexts #-}
module Stackoverflow2 where
import Control.Monad.Reader
----
---- From Log Module - Writes the passed message in the log
----
data LogConfig = LC { logFile :: FilePath }
doLog :: (MonadIO m, MonadReader LogConfig m) => String -> m ()
doLog _ = undefined
----
---- From UserProcessing Module - Reads the user Input and changes it to the configured case
----
data MessageCase = LowerCase | UpperCase deriving (Show, Read)
getUserInput :: (MonadReader MessageCase m, MonadIO m) => m String
getUserInput = undefined
----
---- Main program that combines the two
----
mainProgram :: (MonadReader MessageCase m, MonadReader LogConfig m, MonadIO m) => m ()
mainProgram = do input <- getUserInput
doLog input
liftIO $ putStrLn $ "Entry logged: " ++ input