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]
WordTree
是一个n元树结构,其中单词的公共前缀存储在父树中,其余部分以排序的方式存储在树的叶子上。我相信这个类型定义有点类似于Trie。然而,由于Haskell是一种函数式编程语言,它允许这种类型定义是递归的。在Python中(或者在面向对象编程中,通常),最接近这种类型定义的东西是什么?
3条答案
按热度按时间a7qyws3x1#
因为Python是动态类型的,所以定义你需要的任何类都没有问题。
即使你对输入这些定义感兴趣,你也可以像在任何其他基于类的面向对象语言中一样这样做:
注意类型名称使用字符串(在最近的Python版本中可以避免)。
请参阅mypy中的open issue,了解直接递归代数类型,例如
定义
WordTree
的最常见(尽管不一定推荐)方法是使用超类和浅层次结构:使用这样的实现可能需要使用
isinstance
检查(尽管Python3.10为这些检查提供了nice sugar)。为了避免混乱,本例中省略了构造函数;您可能希望使用dataclass
轻松获取它们和其他类型的行为。到目前为止,Python没有提供任何方法来禁止不相关的类从
WordTree
继承,从而破坏了对此类程序进行静态推理的能力。其他一些OOP语言,比如Scala和Kotlin,以及(即将推出的)Java,可以采用这样的定义(使用
sealed
classes),并给予与Haskell等函数式语言类似的类型检查和语法构造。据我所知,这种设计通常只推荐用于纯数据类,比如AST。它不太适合定义面向用户的容器,如trie,因为它公开了数据结构的内部工作原理。因此,即使采用这种设计,您也可能希望将其用作实现细节,并使用另一个类
Trie
,由客户机代码通过定义良好的API使用。这个类可以有一个WordTree
字段,或者任何其他实现相同逻辑的方式。这对于面向对象设计与功能设计的区别至关重要。后者侧重于数据流和静态推理,而前者侧重于API,可扩展性和解耦。我认为这是有帮助的,当在语言和环境之间移植时-尽管如上所述,一些语言试图启用两种设计方法。
eufgjt7s2#
下面是Python 3.10中Haskell二叉树的等价实现。静态类型检查可以用mypy来完成。
你可以这样使用它(注意
contains
函数中的模式匹配-Python 3.10的新特性):要实现WordTree,您需要执行以下操作:
关于进口的说明:
from __future__ import annotations
允许使用尚未定义的类型的名称进行注解。@dataclass
会自动为您定义一个构造函数。a5g8bdjr3#
我偶然发现这篇文章,希望实现以下内容:
整数
nestedList
的嵌套列表每个元素是一个整数或一个列表,其元素也可以是整数或其他列表。我的实现如下。
给定
[1, [4, [6]]]
,上面的代码创建: