2012-10-25 17 views
13

Sto cercando di far sì che il mio programma Haskell legga le impostazioni da un file esterno, per evitare di ricompilare piccole modifiche. Avendo familiarità con YAML, ho pensato che sarebbe stata una buona scelta. Ora devo mettere insieme i due pezzi. Google non è stato molto utile finora.Lettura YAML in Haskell

Un piccolo esempio di codice relativo alla lettura e alla decostruzione di YAML da un file sarebbe molto apprezzato.

+3

Hai provato a usare il [ 'YAML'] (http://hackage.haskell.org/package/yaml) pacchetto? – dflemstr

+1

una soluzione alternativa alla necessità di base sarebbe quella di utilizzare il pacchetto configuratore di bos. http://hackage.haskell.org/package/configurator –

risposta

23

Se sono interessato a quali pacchetti sono disponibili, vado a hackage, guardo l'elenco completo dei pacchetti, e quindi solo la ricerca in-page per la parola chiave. Facendo che porta in primo piano queste scelte (insieme a pochi altri meno convincenti):

e un wrapper HsSyck chiamato YAML-luce: http://hackage.haskell.org/package/yaml-light

Sia yaml che HsSyck sembrano aggiornati relativamente di recente, e sembrano essere usati da altri pacchetti in uso diffuso. Si può vedere questo controllando le dipendenze inverse:

Dei due, yaml ha più dipendenze, ma che è perché è parte dell'ecosistema Yesod. Una libreria che dipende da HsSyck è yst, che so per caso è mantenuta attivamente, quindi questo mi indica che anche HsSyck va bene.

Il prossimo passo per fare la mia scelta sarebbe quello di sfogliare la documentazione di entrambe le librerie e vedere quale aveva l'API più accattivante per i miei scopi.

Dei due, sembra che HsSyck esponga più struttura ma non molto altro, mentre yaml passa attraverso le codifiche json fornite da aeson. Questo mi indica che il primo è probabilmente più potente mentre il secondo è più conveniente.

+1

Come nota a margine, sia YAML che HsSyck sono in realtà wrapper attorno alle librerie C. YAML è basato su [libyaml] (http://pyyaml.org/wiki/LibYAML) e HsSyck su [Syck] (https://github.com/indeyets/syck). –

+2

Grazie per aver dimostrato il tuo processo di revisione. È bello vedere dal punto di vista di un principiante di haskell. – mindeavor

7

Un semplice esempio:

In primo luogo è necessario un file test.yml:

db: /db.sql 
limit: 100 

lettura YAML in Haskell

{-# 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)