Использование монады читателя для файла конфигурации - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь создать простой файл конфигурации для чтения статических данных из файла.Я использовал примеры из ConfigFile-1.1.4 для чтения данных из файла, хотя я не понимал бит кода, у меня он работает.Но мне нужно пропустить этот файл конфигурации через мое приложение, и я понимаю, что мне нужно использовать монаду readerT для этого?

Рабочая часть моего кода для чтения из файла ниже

getConfig = do
  config <- readConfig "config.cfg"
  putStrLn $ "The path value is: " ++ (path config)
  putStrLn $ "The filename value is: " ++ (fileName config)



readConfig :: String -> IO ConfigInfo
readConfig f = do
    rv <-
    runErrorT $
     do
      cp <- join $ liftIO $ readfile emptyCP f
      let x = cp
      -- read out the attributes
      pv <- get x "DEFAULT" "path"
      fv <- get x "DEFAULT" "filename"
      -- build the config value
      return (ConfigInfo {path = pv, fileName = fv})
    either (\x -> error (snd x)) (\x -> return x) rv

У меня есть функция,

get :: ID -> Name -> IO Keys
get u n = do
    p <- readFile ("getthisvaluefromconfigfile" ++ "getfromConfigfile")
    .
    .
    .
    return (p, b)

Из примеров, которые я читаю, я могучтобы понять, что функция ask вернула бы мне среду, а затем я могу использовать функции для ConfigInfo для извлечения значений.

a) Я просто не могу понять, как загрузить значения в среду вфункция getConfig?

b) И как мне указать в функции ask (Get), какой экземпляр ConfigInfo для чтения?

Я пытался исследовать, нашел несколько примеров, в которых используютсячитатель монада, но ни один из них не показывает, как загрузить env.

...