0

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

data Tree = Node Tree Tree | Nil

我需要能够将此类数据结构从 Haskell 加载到 Python,对其进行更改并将其返回给 Haskell。

有没有一些标准/优雅的方法可以做到这一点而不会带来太多痛苦?例如。使用一些像对象这样的目录?

4

1 回答 1

6

最简单的选择可能是通过 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
            }
        }
于 2022-02-08T12:39:36.597 回答