2012-10-25 34 views
13

我正在寻找让我的Haskell程序从外部文件读取设置,以避免重新编译的细微变化。熟悉YAML,我认为这将是一个不错的选择。现在我必须把这两块拼在一起。到目前为止Google并没有非常有帮助。在Haskell中读取YAML

处理从文件中读取和解构YAML的小例子代码将非常感谢。

+3

您是否尝试过使用['yaml'(HTTP:/ /hackage.haskell.org/package/yaml)包? – dflemstr

+1

您需要的替代解决方案是使用bos的配置程序包。 http://hackage.haskell.org/package/configurator –

回答

23

如果我对可用的软件包感兴趣,那么我会去黑客行为,查看完整的软件包列表,然后在关键字中搜索页面。这样做带来了这些选择(与其他一些不太引人注目的人一起):

和包装器HsSyck叫做YAML光:http://hackage.haskell.org/package/yaml-light

yaml和HsSyck看起来都是相对最近更新的,似乎被其他软件包广泛使用。您可以通过检查反向DEPS看到这一点:

在这两者中,YAML有更多DEPS,但那是因为它是耶索德生态系统的一部分。一个依赖HsSyck的库是yst,我碰巧知道这个库已经被主动维护了,所以这表明HsSyck也很好。

做出选择的下一步是浏览这两个库的文档,并查看哪些文档对我的目的具有更吸引人的api。

在两者中,看起来HsSyck暴露更多的结构,但没有其他的东西,而yaml通过aeson提供的json编码。这表明前者可能更强大,而后者更方便。

+1

另外,YAML和HsSyck实际上都是C库的包装器。 YAML基于[libyaml](http://pyyaml.org/wiki/LibYAML)和HsSyck [Syck](https://github.com/indeyets/syck)。 –

+2

感谢您展示您的评论过程。从哈斯克尔初学者的角度来看,这真是太棒了。 – mindeavor

7

一个简单的例子:

首先你需要一个test.yml文件:

db: /db.sql 
limit: 100 

阅读YAML哈斯克尔

{-# LANGUAGE DeriveGeneriC#-} 

import GHC.Generics 
import Data.Yaml 

data Config = Config { db :: String 
        , limit :: Int 
        } deriving (Show, Generic) 

instance FromJSON Config 

main :: IO() 
main = do 
    file <- decodeFile "test.yml" :: IO (Maybe Config) 
    putStrLn (maybe "Error" show file)