返回

如何简化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"
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像