我正在嘗試決議一些將標記元資料作為分號分隔的字串的博客文章,例如:
# title: Some Title
# date: 2021-02-04
# keywords: tag1; tag two; tag three
我有他們的資料結構,我只需要讓 Aeson 決議器在分號上拆分。然而,似乎并沒有這么簡單:
data SrcMeta
= SrcMeta
{ title :: Text,
date :: Text,
tags :: [Text]
}
deriving (Show, Eq, Generic)
instance FromJSON SrcMeta where
parseJSON (Aeson.Object v) = do
title <- v Aeson..: "title"
date <- v Aeson..: "date"
tags <- T.splitOn ";" $ v Aeson..: "keywords"
return SrcMeta { title = title, date = date, tags = tags }
型別不匹配是T.splitOn需要 a Text,并.:回傳 a Parser。我在想這個錯誤嗎?將分號分隔的字串決議為 的最佳方法是[Text]什么?
uj5u.com熱心網友回復:
您可以先檢索Text然后拆分它,例如:
instance FromJSON SrcMeta where
parseJSON (Aeson.Object v) = do
title <- v Aeson..: "title"
date <- v Aeson..: "date"
tags <- v Aeson..: "keywords"
return SrcMeta { title = title, date = date, tags = T.splitOn ";" tags }
另一種選擇是使用函子映射(<$>) :: Functor f => (a -> b) -> f a -> f b:
instance FromJSON SrcMeta where
parseJSON (Aeson.Object v) = do
title <- v Aeson..: "title"
date <- v Aeson..: "date"
tags <- T.splitOn ";" <$> (v Aeson..: "keywords")
return SrcMeta { title = title, date = date, tags = tags }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386993.html
上一篇:haskell的結構歸納
