首页 > 编程问答 >Python 中的递归数据类型

Python 中的递归数据类型

时间:2024-07-31 06:47:30浏览次数:13  
标签:python haskell python-typing recursive-datastructures algebraic-data-types

Python 中最接近 Haskell 中的递归数据类型的是什么? (即在定义自身时使用类型自己的定义。)

编辑:

为了给出递归类型的更具体定义,下面是 Haskell 中的二叉树:

data Tree a             = Leaf a | Branch (Tree a) (Tree a) 

我的阅读方式如下:二叉树可以是叶子,也可以包含两个子树,这两个子树又是类型树本身。

有关 Haskell 中递归类型的更多信息,您可以参考这里: https:// www.haskell.org/tutorial/goodies.html

我实际上想到的是将 Haskell 中的单词树定义转换为 Python。这是我的一个旧项目中对 WordTree 的定义:

data WordTree = Word String | Subword String [WordTree] | Root [WordTree]

A WordTree 是一个 n 叉树结构,其中单词的公共前缀存储在父级中,其余部分存储在树的叶子中以排序的方式。我相信这种类型定义有点类似于 Trie。然而,由于 Haskell 是一种函数式编程语言,它允许这种类型定义是递归的。 Python 中(或者一般来说,在面向对象的编程中)对于这种类型的定义最接近的可能是什么?


尽管 Python 的类定义不像 Haskell 的代数数据类型那样以递归类型为中心,但你可以使用 Python 的类引用和类型提示来实现类似的行为和功能。

Python 实现

from __future__ import annotations  # 允许在类型提示中进行前向引用
from typing import List

class WordTree:
    def __init__(self, value: str, children: List[WordTree] = None):
        self.value = value
        self.children = children if children else []

    def __repr__(self):
        if not self.children:
            return f"Word('{self.value}')"
        else:
            return f"Subword('{self.value}', [{', '.join(repr(child) for child in self.children)}])"

# 示例用法
root = WordTree("")
root.children = [
    WordTree("the", [WordTree("re"), WordTree("ir")]),
    WordTree("a"),
    WordTree("to")
]

print(root)  # 输出:Subword('', [Subword('the', [Word('re'), Word('ir')]), Word('a'), Word('to')])

解释

  1. 前向引用: from __future__ import annotations 行允许我们在类型提示中使用 List[WordTree] ,即使 WordTree 类还没有定义完毕。
  2. 递归结构: WordTree 类可以通过其 children 属性包含自身的实例列表,从而有效地创建了一个递归树结构。
  3. 类型提示: 我们使用类型提示(例如 value: str children: List[WordTree] )来提高代码的可读性和可维护性。这些提示帮助阐明每个属性的预期类型。

与 Haskell 定义的比较

虽然这种 Python 实现不像 Haskell 版本那样简洁和在类型级别上执行,但它捕捉了相同的递归本质。你可以根据需要扩展此类,添加方法以按照 Haskell 示例的方式遍历、搜索和操作树。

其他注意事项

  • Python 中没有与 Haskell 的模式匹配直接对应的功能。你可以使用 isinstance 检查并在类方法中使用条件语句来实现类似的逻辑。
  • Python 的动态类型允许在运行时更灵活,但也会丢失 Haskell 提供的一些类型安全性。使用类型提示(特别是与 MyPy 等类型检查器一起使用)可以帮助减轻这种损失。

总的来说,虽然 Python 没有与 Haskell 的代数数据类型直接对应的功能,但你可以使用类、列表和类型提示有效地表示和处理递归数据结构,例如你的 WordTree 示例。

标签:python,haskell,python-typing,recursive-datastructures,algebraic-data-types
From: 63694831

相关文章

  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......
  • 在 Lambda Python 中获取 errorMessage": "期望值: 第 1 行第 1 列 (char 0)"
    我正在尝试使用slackapi和awslambda函数创建一个slack机器人。现在我只希望每当用户说“你好”时它就响应“你好”。当我在Lambda代码编辑器中测试代码时,出现此错误。我对Lambda很陌生,并且已经被困在这个问题上有一段时间了。非常感谢任何帮助!完整错误:Response......
  • 具有 Python lambda 函数的 QTimer 使用先前的数据运行
    我有一个GUI项目,它使用PySide2和Python3.8,它在QThread中执行一些后台任务。在该QThread中,我有QTimer成员对象,该对象必须定期运行一个函数,每次向其传递不同的数据。我没有使用QTimer.singleShot静态函数,因为如果需要某些特定场景,我需要......
  • 我如何在 python 上使用 spire.pdf 修复此错误
    我使用spirepdf,但出现以下错误:“DllNotFound_Windows,libSkiaSharp,Nosepuedeencontrarelmóduloespecificado.:....”defextract_text_from_pdf(file_path,output_file):#LoadaPDFdocumentdoc=PdfDocument()doc.LoadFromFile(file_path)ex......
  • C++ 函数返回极其缓慢,远慢于功能等效的 python 代码
    我有一个在我编写的脚本中使用的函数,用于从列表中删除多余的阻塞关键字。基本上,输入(以任何顺序):{"apple","bapple","banana","cherry","bananaman","sweetherrypie","sweet","b"}它应该输出一个缩小的字符串数组(以任何顺序):......
  • 在预定时间从 python telegram bot 发起对话
    对于没有提供代码,我提前表示歉意。我明天会尝试添加它,但我现在还没有接近它,思考如何解决这个问题让我一直在思考。我已经为一个机器人创建了一个程序,该程序的数据帧充满了之前请求的用户添加到机器人的消息列表中。现在,机器人使用job_queue在一天中的随机时间向每个用户发......
  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......