如何在Python中优雅地表示有限Haskell递归数据结构



让我们在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
}
}

相关内容

  • 没有找到相关文章