如何在 Python 中优雅地表示有限 Haskell 递归数据结构?
How to elegantly represent finite Haskell recursive datastructure in Python?
让我们在 Haskell 中有一些有限的递归数据结构。例如
data Tree = Node Tree Tree | Nil
我需要能够将这样的数据结构从 Haskell 加载到 Python,将其更改并 return 返回到 Haskell。
是否有一些 standard/elegant 方法可以不那么痛苦地做到这一点?例如。使用一些像对象这样的目录?
最简单的选择可能是通过 JSON,因为 Haskell 很容易支持保存数据,因为 JSON 而 Python 可以直接将其作为字典加载。
{-# 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
}
}
让我们在 Haskell 中有一些有限的递归数据结构。例如
data Tree = Node Tree Tree | Nil
我需要能够将这样的数据结构从 Haskell 加载到 Python,将其更改并 return 返回到 Haskell。
是否有一些 standard/elegant 方法可以不那么痛苦地做到这一点?例如。使用一些像对象这样的目录?
最简单的选择可能是通过 JSON,因为 Haskell 很容易支持保存数据,因为 JSON 而 Python 可以直接将其作为字典加载。
{-# 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
}
}