我正在尝试提出模块化程序设计,我再次请求您的帮助。
作为这些后续帖子Monad Transformers vs Passing Parameters and Large Scale Design in Haskell的后续,我正在尝试构建两个独立的模块,它们使用 Monad Transformers 但公开与 Monad 无关的函数,然后结合每个模块中的 Monad 不可知函数这些模块成为一个新的与 Monad 无关的函数。
我一直无法运行组合功能,例如如何在下面的示例中调用mainProgram
using runReaderT
?
次要问题是:是否有更好的方法来实现相同的模块化设计目标?
该示例有两个模拟模块(但可以编译),一个执行日志记录,一个读取用户输入并对其进行操作。组合功能读取用户输入,记录并打印。
{-# 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