我有以下代碼:
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Tree
main :: IO ()
main = print $ decode "[1,[2,[]]]" :: Maybe (Tree Int)
但是控制臺中的輸出是“Nothing”。如何將 JSON 資料決議為Tree String型別Tree Int?據我所知,只要Tree v有實體就有實體。fromJSONvfromJSON
uj5u.com熱心網友回復:
我不是很熟悉 Aeson 是如何定義這些實體的,所以我去看了 Hackage。在定義此實體的模塊中Data.Aeson.Types.ToJSON,我看到以下代碼:
instance ToJSON1 Tree.Tree where
liftToJSON t tol = go
where
go (Tree.Node root branches) =
liftToJSON2 t tol to' tol' (root, branches)
to' = liftToJSON go (listValue go)
tol' = liftToJSONList go (listValue go)
liftToEncoding t tol = go
where
go (Tree.Node root branches) =
liftToEncoding2 t tol to' tol' (root, branches)
to' = liftToEncoding go (listEncoding go)
tol' = liftToEncodingList go (listEncoding go)
instance (ToJSON v) => ToJSON (Tree.Tree v) where
toJSON = toJSON1
toEncoding = toEncoding1
對這里的呼叫liftToJSON2和讀取instance ToJSON2 (,)andinstance ToJSON1 []告訴我 aNode表示為兩個元素的陣列,其中前者是根值的編碼,后者是分支的編碼。由于這是一個串列,它也被編碼為一個陣列。
所以你的例子[1,[2,[]]]很接近,但你缺少一層嵌套——因為Tree 1 [Tree 2 []]是通過編碼的(1, [(2, [])]),我推斷它需要是[1,[[2,[]]]]。這可能記錄在某處,但我不能輕易找到它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528490.html
標籤:哈斯克尔树
