如何简化Haskell中YAML的阅读
发布时间:2022-08-17 21:51:18 273
相关标签: # html# 数据
如果我有一个YAML,
canary_instance:
name: instance_name
metadata:
a:
b:
c: d
如何在没有太多样板代码的情况下轻松获得嵌套块的值?e、 g.类似Pythonobj["canary_instance"]["metadata"]["a"]["b"]["c"]
无需为每个键写入新的数据类型
我遵循了这一点辅导的,并进行修改以适合上述示例
{-# LANGUAGE OverloadedStrings #-}
module Parser where
import Prelude hiding (readFile)
import Data.Aeson
import Data.Map (Map)
import qualified Data.Map as Map
import qualified Data.Yaml as Y
data Instance = Instance
{ name :: String
, metadata :: InstanceMetadata
} deriving Show
data InstanceMetadata = InstanceMetadata
{ a :: InstanceMetadataA
} deriving Show
data InstanceMetadataA = InstanceMetadataA
{ b :: InstanceMetadataB
} deriving Show
data InstanceMetadataB = InstanceMetadataB
{ c :: String
} deriving Show
instance FromJSON Instance where
parseJSON (Object m) = Instance <$>
m .: "name" <*>
m .: "metadata"
parseJSON x = fail ("not an object: " ++ show x)
instance FromJSON InstanceMetadata where
parseJSON (Object m) = InstanceMetadata <$>
m .: "a"
parseJSON x = fail ("not an object: " ++ show x)
instance FromJSON InstanceMetadataA where
parseJSON (Object m) = InstanceMetadataA <$>
m .: "b"
parseJSON x = fail ("not an object: " ++ show x)
instance FromJSON InstanceMetadataB where
parseJSON (Object m) = InstanceMetadataB <$>
m .: "c"
parseJSON x = fail ("not an object: " ++ show x)
main :: IO ()
main = do
y <- either (error . show) id <$>
Y.decodeFileEither "example.yaml" :: IO (Map String Instance)
print y
print $ fmap (c . b . a . metadata) (Map.lookup "canary_instance" y)
输出为
> :main
fromList [("canary_instance",Instance {name = "instance_name", metadata = InstanceMetadata {a = InstanceMetadataA {b = InstanceMetadataB {c = "d"}}}})]
Just "d"
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报