让我们在Haskell中拥有一些有限的递归数据结构。例如
data Tree = Node Tree Tree | Nil
我需要能够将这样的数据结构从Haskell加载到Python,对其进行更改并将其返回给Haskell。
有没有一些标准/优雅的方法可以在不太痛苦的情况下做到这一点?例如,使用一些类似目录的对象?
最简单的选择可能是通过JSON,因为Haskell很容易支持将数据保存为JSON,Python可以直接将其加载为dicts。
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import GHC.Generics
import Data.Aeson
import Data.Aeson.TH
data Tree = Node Tree Tree | Nil
deriving (Generic, FromJSON, ToJSON)
这会生成相当尴尬的JSON,比如Node (Node Nil Nil) Nil
变成
"tag": "Node",
"contents": [
{
"tag": "Node",
"contents": [
{
"tag": "Nil"
},
{
"tag": "Nil"
}
]
},
{
"tag": "Nil"
}
]
使其更加紧凑
data TreeNode = Node { lSubtree, rSubtree :: Tree }
deriving (Generic, FromJSON, ToJSON)
type Tree = Maybe TreeNode
其中等效的Node (Just (Node Nothing Nothing)) Nothing
现在被保存为
{
"rSubtree": null,
"lSubtree": {
"rSubtree": null,
"lSubtree": null
}
}