假设这个 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/