2012-10-25 15 views
13

में वाईएएमएल पढ़ना मैं मामूली परिवर्तनों के लिए पुनर्मूल्यांकन से बचने के लिए, मेरे हास्केल प्रोग्राम को बाहरी फ़ाइल से सेटिंग्स पढ़ना चाहता हूं। वाईएएमएल से परिचित होने के नाते, मैंने सोचा कि यह एक अच्छा विकल्प होगा। अब मुझे दो टुकड़े एक साथ रखना है। Google अब तक बहुत उपयोगी नहीं रहा है।हास्केल

फ़ाइल से वाईएएमएल पढ़ने और deconstructing से निपटने वाला एक छोटा सा उदाहरण कोड बहुत सराहना की जाएगी।

+3

db: /db.sql limit: 100 

पढ़ना हास्केल में YAML आप उपयोग करने की कोशिश है [ 'yaml'] (http://hackage.haskell.org/package/yaml) पैकेज? – dflemstr

+1

आपकी मूल आवश्यकता का एक वैकल्पिक समाधान बोस कॉन्फ़िगरेटर पैकेज का उपयोग करना होगा। http://hackage.haskell.org/package/configurator –

उत्तर

23

यदि मुझे रुचि है कि कौन से पैकेज उपलब्ध हैं, तो मैं हैकेज पर जाता हूं, पूर्ण पैकेज सूची को देखता हूं, और फिर कीवर्ड के लिए केवल खोज-इन-पेज। ऐसा करने से है कि इन विकल्पों को लाता है (कुछ अन्य कम सम्मोहक लोगों के साथ):

और एक आवरण HsSyck YAML प्रकाश नामक चारों ओर: http://hackage.haskell.org/package/yaml-light

दोनों yaml और HsSyck अपेक्षाकृत हाल ही में अपडेट किए गए हैं, और व्यापक रूप से उपयोग में अन्य पैकेजों द्वारा उपयोग किए जाने लगते हैं। आप रिवर्स deps देख कर इसकी देख सकते हैं:

दो के

, YAML अधिक deps है, लेकिन क्योंकि यह Yesod पारिस्थितिकी तंत्र का हिस्सा है। एचएससीक पर निर्भर एक पुस्तकालय है, जो मुझे पता है कि सक्रिय रूप से बनाए रखा गया है, जिससे मुझे संकेत मिलता है कि एचएससीक ठीक है।

मेरी पसंद बनाने में अगला कदम दोनों पुस्तकालयों के दस्तावेज़ीकरण के माध्यम से ब्राउज़ करना होगा और देखें कि मेरे उद्देश्यों के लिए अधिक आकर्षक एपीआई कौन सा था।

दोनों में से, ऐसा लगता है कि एचएससीक ने अधिक संरचना का खुलासा किया लेकिन अधिक नहीं, जबकि यमल एसन द्वारा प्रदान किए गए जेसन एन्कोडिंग के माध्यम से जाता है। यह मुझे इंगित करता है कि पूर्व शायद अधिक शक्तिशाली है जबकि उत्तरार्द्ध अधिक सुविधाजनक है।

+1

एक साइड नोट के रूप में, वाईएएमएल और एचएससीक दोनों वास्तव में सी पुस्तकालयों के आसपास रैपर हैं। वाईएएमएल [libyaml] (http://pyyaml.org/wiki/LibYAML) और HsSyck पर [Syck] (https://github.com/indeyets/syck) पर आधारित है। –

+2

आपकी समीक्षा प्रक्रिया का प्रदर्शन करने के लिए धन्यवाद। एक हैकेल शुरुआती दृष्टिकोण के दृष्टिकोण से देखना बहुत अच्छा है। – mindeavor

7

एक साधारण उदाहरण:

सबसे पहले आप एक test.yml फ़ाइल की आवश्यकता:

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