在Haskell中阅读YAML

mka*_*ito 15 yaml haskell

我希望让我的Haskell程序从外部文件中读取设置,以避免重新编译以进行微小更改.熟悉YAML,我认为这是一个不错的选择.现在我必须把两件放在一起.到目前为止,谷歌并没有提供太多帮助.

一个处理从文件中读取和解构YAML的示例代码将非常受欢迎.

scl*_*clv 25

如果我对可用的软件包感兴趣,我会去hackage,查看完整的软件包列表,然后只搜索关键字.这样做会带来这些选择(以及其他一些不太引人注目的选择):

还有一个名为yaml-light的HsSyck包装器:http://hackage.haskell.org/package/yaml-light

yaml和HsSyck最近都看起来更新了,并且似乎被广泛使用的其他软件包使用.你可以通过检查反向deps来看到这个:

在这两个中,yaml有更多的deps,但这是因为它是yesod生态系统的一部分.一个依赖于HsSyck的库是yst,我碰巧知道它是积极维护的,因此这向我表明HsSyck也很好.

我做出选择的下一步是浏览两个库的文档,看看哪个具有更吸引人的api用于我的目的.

在这两个中,看起来HsSyck暴露了更多的结构,但没有多少,而yaml通过aeson提供的json编码.这向我表明,前者可能更强大,而后者更方便.

  • 附带说明一下,YAML 和 HsSyck 实际上都是 C 库的包装器。YAML 基于 [libyaml](http://pyyaml.org/wiki/LibYAML) 和 HsSyck 基于 [Syck](https://github.com/indeyets/syck)。 (3认同)
  • 感谢您展示您的审核流程.从haskell初学者的角度来看,这很棒. (3认同)

小智 10

一个简单的例子:

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

db: /db.sql
limit: 100
Run Code Online (Sandbox Code Playgroud)

在Haskell中阅读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)
Run Code Online (Sandbox Code Playgroud)