2012-10-25 33 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)