2012-10-25 12 views
13

Czekam, aby mój program Haskell odczytał ustawienia z zewnętrznego pliku, aby uniknąć rekompilacji w przypadku drobnych zmian. Znając YAML, pomyślałem, że to dobry wybór. Teraz muszę połączyć te dwie części. Jak dotąd Google nie był bardzo pomocny.Czytanie YAML w Haskell

Mały przykładowy kod zajmujący się odczytywaniem i dekonstruowaniem YAML z pliku byłby bardzo doceniany.

+3

Czy próbowali za pomocą [ 'yaml'] (http://hackage.haskell.org/package/yaml) pakiet? – dflemstr

+1

alternatywnym rozwiązaniem dla twojej podstawowej potrzeby byłoby użycie pakietu bos 'configurator. http://hackage.haskell.org/package/configurator –

Odpowiedz

23

Jeśli interesuje mnie, jakie pakiety są dostępne, przechodzę do hakowania, sprawdzam pełną listę pakietów, a następnie szukam tylko słowa kluczowego. Robi, że wychowuje tych wyborów (wraz z kilkoma innymi mniej istotnych z nich):

i owinięcie wokół HsSyck nazywa yaml-light: http://hackage.haskell.org/package/yaml-light

Zarówno yaml, jak i HsSyck wyglądają na stosunkowo niedawno zaktualizowane i wydają się być używane przez inne pakiety w powszechnym użyciu. Widać to poprzez sprawdzenie odwrotne deps:

Z tych dwóch, yaml ma więcej deps, ale to dlatego, że jest częścią ekosystemu jesod. Jedną z bibliotek, która zależy od HsSyck, jest ta, którą zdaję sobie sprawę, jest aktywnie utrzymywana, co oznacza, że ​​HsSyck też jest w porządku.

Następnym krokiem w dokonaniu wyboru byłoby przejrzenie dokumentacji obu bibliotek i sprawdzenie, który z nich był bardziej atrakcyjny dla moich celów.

Wygląda na to, że HsSyck ma więcej struktur, ale niewiele więcej, podczas gdy yaml przechodzi przez kodowanie json dostarczone przez aeson. To wskazuje mi, że ten pierwszy jest prawdopodobnie silniejszy, podczas gdy drugi jest wygodniejszy.

+1

Na marginesie, zarówno YAML, jak i HsSyck faktycznie owijają biblioteki C. YAML oparty jest na [libyaml] (http://pyyaml.org/wiki/LibYAML) i HsSyck na [Syck] (https://github.com/indeyets/syck). –

+2

Dziękujemy za przedstawienie procesu recenzji. Wspaniale jest zobaczyć z punktu widzenia początkującego haskell. – mindeavor

7

Prosty przykład:

Najpierw trzeba test.yml plik:

db: /db.sql 
limit: 100 

Reading YAML w 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)