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

Pře*_*tný 0 python haskell cpython haskell-ffi

让我们在 Haskell 中使用一些有限递归数据结构。例如。

data Tree = Node Tree Tree | Nil
Run Code Online (Sandbox Code Playgroud)

我需要能够将这样的数据结构从 Haskell 加载到 Python,更改它并将其返回到 Haskell。

有没有一些标准/优雅的方法可以在没有太多痛苦的情况下做到这一点?例如。使用一些目录之类的对象?

lef*_*out 6

最简单的选择可能是通过 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)
Run Code Online (Sandbox Code Playgroud)

这会生成相当尴尬的 JSON,就像,Node (Node Nil Nil) Nil变成

        "tag": "Node",
        "contents": [
            {
                "tag": "Node",
                "contents": [
                    {
                        "tag": "Nil"
                    },
                    {
                        "tag": "Nil"
                    }
                ]
            },
            {
                "tag": "Nil"
            }
        ]
Run Code Online (Sandbox Code Playgroud)

它变得更加紧凑

data TreeNode = Node { lSubtree, rSubtree :: Tree }
 deriving (Generic, FromJSON, ToJSON)

type Tree = Maybe TreeNode
Run Code Online (Sandbox Code Playgroud)

其中等效项Node (Just (Node Nothing Nothing)) Nothing现在保存为

        {
            "rSubtree": null,
            "lSubtree": {
                "rSubtree": null,
                "lSubtree": null
            }
        }
Run Code Online (Sandbox Code Playgroud)