在Haskell中读取一个ini文件

时间:2017-12-27 15:23:58

标签: haskell ini

我正在尝试在Haskell中读取一个简单的.ini文件,以用作我的应用程序的配置。我不是Haskell的专家,所以我可能会遗漏一些简单的东西。

到目前为止,我的简化代码看起来像这样

{-# LANGUAGE OverloadedStrings          #-}

import Data.Ini

main :: IO ()
main = do
  config <- readIniFile "config.ini"
  p <- lookupValue "NETWORK" "port" config

  ...

编译器给我这个错误

无法将期望类型'Ini'与lookupValue的第三个参数中的实际类型'Either String Ini'匹配,即'config'。

我查看了docs的Data.Ini,但我找不到任何关于如何使用Api的示例。

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

问题是readIniFile会返回IO (Either String Ini)。并且lookupValue需要Ini值。因此,您必须从Either内部解开ini值,并正确处理错误。

我非常确定这是解决问题的更加一元化和富有表现力的方法,但这里有一个解决方案。

{-# LANGUAGE OverloadedStrings #-}

import Data.Ini

main :: IO ()
main = do
    config <- readIniFile "config.ini"
    case config of
        Right ini -> do
            let p = lookupValue "NETWORK" "port" ini
            putStrLn $ case p of
                        Left s -> s
                        Right t -> show t
        Left s -> putStrLn s

答案 1 :(得分:2)

阅读文档时,readIniFile会返回IO (Either String Ini),但lookupValue的第三个参数必须为Ini(并返回Either String Text)。您需要使用case语句来检索ini:

result <- readIniFile "config.ini"
p <- case result of
         Left str -> Left str
         Right ini -> lookupValue "NETWORK" "port" ini

读取源代码时,左判别似乎用于报告错误消息。

如果你想变得更加漂亮,你可以使用Either作为monad:https://hackage.haskell.org/package/base-4.10.1.0/docs/Data-Either.html#t:Either

result <- readIniFile "config.ini"
p <- (result >>= (lookupValue "Network" "port"))