如何在 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
            }
        }