代码之家  ›  专栏  ›  技术社区  ›  Matteo Ugolotti

在Haskell中读取ini文件

  •  1
  • Matteo Ugolotti  · 技术社区  · 7 年前

    我想读一本简单的。Haskell中的ini文件,用作我的应用程序的配置。我不是哈斯克尔的专家,所以我可能遗漏了一些简单的东西。

    到目前为止,我的简化代码如下所示

    {-# LANGUAGE OverloadedStrings          #-}
    
    import Data.Ini
    
    main :: IO ()
    main = do
      config <- readIniFile "config.ini"
      p <- lookupValue "NETWORK" "port" config
    
      ...
    

    编译器给了我这个错误

    在lookupValue的第三个参数即“config”中,无法将预期的类型“Ini”与实际类型“或字符串Ini”匹配。

    我看了看 docs 用于数据。但我找不到如何使用Api的任何示例。

    任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Eric Chiesse    7 年前

    问题是 readIniFile 返回 IO (Either String Ini) . 和 lookupValue 需要 Ini 价值因此,必须从 Either 并提供正确的错误处理。

    我很确定有一种更为单一和富有表现力的方式来解决这个问题,但这里有一个解决方案。

    {-# 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
    
        2
  •  2
  •   Del    7 年前

    阅读文档, 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
    

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

    如果您想变得更花哨,可以将以下任一项用作单子: 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"))