2012-10-25 21 views
13

Tôi đang tìm cách cài đặt đọc chương trình Haskell từ một tệp bên ngoài, để tránh biên dịch lại cho những thay đổi nhỏ. Làm quen với YAML, tôi nghĩ đó sẽ là một lựa chọn tốt. Bây giờ tôi phải ghép hai miếng lại với nhau. Google đã không được rất hữu ích cho đến nay.Đọc YAML trong Haskell

Một ví dụ nhỏ về giao dịch đọc và giải mã YAML từ một tệp sẽ được đánh giá rất nhiều.

+3

Các bạn đã thử bằng cách sử dụng [ 'yaml'] (http://hackage.haskell.org/package/yaml) gói? – dflemstr

+1

một giải pháp thay thế cho nhu cầu cơ bản của bạn sẽ là sử dụng gói cấu hình bos. http://hackage.haskell.org/package/configurator –

Trả lời

23

Nếu tôi quan tâm đến những gói nào có sẵn, tôi truy cập vào hackage, xem danh sách gói hoàn chỉnh và sau đó chỉ tìm kiếm trong trang cho từ khóa. Làm điều đó sẽ trả về những lựa chọn này (cùng với một vài người ít hấp dẫn khác):

và một wrapper xung quanh HsSyck gọi yaml-ánh sáng: http://hackage.haskell.org/package/yaml-light

Cả hai giao diện yaml và HsSyck được cập nhật tương đối gần đây và dường như được sử dụng bởi các gói khác trong việc sử dụng rộng rãi. Bạn có thể thấy điều này bằng cách kiểm tra DEPS ngược lại:

Trong hai, YAML có nhiều DEPS, nhưng đó là bởi vì nó là một phần của hệ sinh thái Yesod. Một thư viện phụ thuộc vào HsSyck là yst, điều mà tôi biết là được duy trì tích cực, vì vậy điều đó cho tôi thấy rằng HsSyck cũng tốt.

Bước tiếp theo trong việc lựa chọn của tôi là duyệt qua tài liệu của cả hai thư viện và xem tài liệu nào có api hấp dẫn hơn cho mục đích của tôi.

Trong số hai, có vẻ như HsSyck cho thấy nhiều cấu trúc hơn nhưng không nhiều khác, trong khi yaml đi qua các mã hóa json do aeson cung cấp. Điều này cho tôi biết rằng cái cũ có lẽ mạnh hơn trong khi cái thứ hai thuận tiện hơn.

+1

Như một lưu ý phụ, cả YAML và HsSyck đều là các trình bao bọc xung quanh các thư viện C. YAML dựa trên [libyaml] (http://pyyaml.org/wiki/LibYAML) và HsSyck trên [Syck] (https://github.com/indeyets/syck). –

+2

Cảm ơn bạn đã chứng minh quá trình đánh giá của mình. Thật tuyệt khi nhìn từ quan điểm của người mới bắt đầu. – mindeavor

7

Một ví dụ đơn giản:

Trước tiên, bạn cần một tập tin test.yml:

db: /db.sql 
limit: 100 

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