parsing - 在 Haskell 中读取 YAML 对象列表

标签 parsing haskell yaml

假设这个 YAML(保存在一个名为 users.yml 的文件中):

- id: 1
  name: Unknown user
  reputation: 0

- id: 2
  name: Foo bar
  reputation: 4

和这个 Haskell data 类型:
data MyUser = MyUser {id :: Int,
                      name :: String,
                      reputation :: Int}
                      deriving (Show)

我想使用 yaml 库将 YAML 读入 [MyUser] 。我怎样才能做到这一点?

最佳答案

您需要创建一个 FromJSON 实例(请注意,这称为 FromJSON,因为 yaml 源自 Aeson 库),如 Data.Yaml documentation 中所述。

here 之前讨论了与 Aeson 类似的问题,而讨论了 Haskell YAML 库的选择 here

这是一个将 YAML 文件转换为 [MyUser] 的最小工作示例:

{-# LANGUAGE OverloadedStrings #-}
import Data.Yaml
import Control.Applicative -- <$>, <*>
import Data.Maybe (fromJust)

import qualified Data.ByteString.Char8 as BS

data MyUser = MyUser {id :: Int,
                      name :: String,
                      reputation :: Int}
                      deriving (Show)

instance FromJSON MyUser where
    parseJSON (Object v) = MyUser <$>
                           v .: "id" <*>
                           v .: "name" <*>
                           v .: "reputation"
    -- A non-Object value is of the wrong type, so fail.
    parseJSON _ = error "Can't parse MyUser from YAML/JSON"

main = do
         ymlData <- BS.readFile "users.yml"
         let users = Data.Yaml.decode ymlData :: Maybe [MyUser]
         -- Print it, just for show
         print $ fromJust users

关于parsing - 在 Haskell 中读取 YAML 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21292428/

相关文章:

parsing - 无法理解解析器组合器中的 'pMany' 和 'pMany1'

parsing - 在 Attoparsec 中使用 sepBy 字符串

azure - 如果有警告,则使构建失败,YAML

objective-c - 通过 NSDataDetector 检测持续时间

javascript - 如何在 PEG 语法中描述函数参数

haskell - 当你依赖一个 cabal 包时,它似乎会在所有 cabal 节中引入依赖关系

docker - 在 docker-compose.yml 文件中获取或设置 env 变量

node.js - 如何安装新的 nodejs 模块到 expressjs 项目?

C# - 解析包含逻辑运算符的复杂字符串

javascript - 在 Python 中解析 BeautifulSoup 后的脚本标签