2017-12-27 205 views
1

我正在尝试阅读Haskell中的简单.ini文件,以用作我的应用程序的配置。我不是Haskell的专家,所以我可能会错过简单的东西。阅读Haskell中的ini文件

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

{-# LANGUAGE OverloadedStrings   #-} 

import Data.Ini 

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

    ... 

编译器给了我这个错误

无法匹配,期望型“燕丽”与实际类型的“任意字符串燕丽”在第三个参数lookupValue即'config'。

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

任何帮助将非常感激。

+0

听起来配置返回一个字符串要么燕丽,而不仅仅是一个ini。只是在配置模式匹配,'左犯错的情况下配置 - > putStrLn错误;正确的c - >做lookupValue ...' – Zpalmtree

回答

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 
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 

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

如果你想更大胆的尝试,你可以使用一个单子: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"))