Я пытаюсь придумать модульный дизайн программы, и я, еще раз, любезно прошу вашу помощь.
Как продолжение следующих сообщений Monad Transformers vs pass Parameters и Масштабный дизайн в Haskell Я пытаюсь создать два независимых модуля, которые используют Monad Transformers, но выставляют Monad-agnostic функции, а затем объединяют Monad-agnostic функцию от каждого из этих модулей в новую Monad-агностическую функцию.
Мне не удалось запустить функцию объединения, например. как я могу вызвать mainProgram
с помощью runReaderT
в примере ниже?.
Дочерний вопрос: есть ли лучший способ достичь той же модульной цели дизайна?
В примере есть два модуля mock (но компиляции), один из которых выполняет регистрацию, и тот, который читает ввод пользователя и манипулирует им. Функция объединения считывает пользовательский ввод, регистрирует его и печатает.
{-# 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