【问题标题】:Read an ini file in Haskell在 Haskell 中读取一个 ini 文件
【发布时间】:2017-12-28 00:10:13
【问题描述】:

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

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

{-# LANGUAGE OverloadedStrings          #-}

import Data.Ini

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

  ...

编译器给了我这个错误

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 听起来像配置返回一个 Either String Ini 而不仅仅是一个 Ini。只需在配置上进行模式匹配,case config of Left err -&gt; putStrLn err; Right c -&gt; do lookupValue ...

标签: haskell ini


【解决方案1】:

问题是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

【讨论】:

    【解决方案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
    

    阅读源码,Left判别式好像是用来报错信息的。

    如果你想变得更高级,可以使用 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"))
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2013-04-18
      相关资源
      最近更新 更多