gpt4 book ai didi

python - Haskell相当于Python中的数据构造函数?

转载 作者:太空狗 更新时间:2023-10-30 02:32:22 24 4
gpt4 key购买 nike

在Haskell中,我可以定义一个二叉树如下:

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

然后我可以对它进行如下操作:

height (Leaf a) = 1
height (Branch a l r) = 1 + (max (height l) (height r))

count (Leaf a) = 1
count (Branch a l r) = 1 + (count l) + (count r)

我知道 Python 在 Haskell 中没有等同于 data 的东西。如果有,请告诉。

那么,在Python中如何定义一棵二叉树,以及如何在其中实现上述两个功能呢?

最佳答案

我在这里寻找与 Haskell 非常相似的函数式编程。从某种意义上说,这不是很“pythonic”。特别是,它不是面向对象的。不过,它仍然有用且干净。

数据类型是一个类。具有多个数据构造函数的数据类型是一个具有有关其构造方式的额外信息的类。当然,它需要一些数据。使用构造函数确保所有树都是合法的:

class BinTree (object):
def __init__(self, value=None, left=None, right=None):
if left == None and right == None and value != None:
self.isLeaf = True
self.value = value
elif left != None and right != None and value == None:
self.isLeaf = False
self.value = (left, right)
else:
raise ArgumentError("some help message")

这个构造函数调用起来有点不方便,所以有一些简单易用的智能构造函数:

def leaf(value):
return BinTree(value=value)

def branch(left, right):
return BinTree(left=left, right=right)

我们如何获取值?让我们也为此做一些帮助:

def left(tree):
if tree.isLeaf:
raise ArgumentError ("tree is leaf")
else:
return tree.value[0]

def right(tree):
if tree.isLeaf:
raise ArgumentError ("tree is leaf")
else:
return tree.value[1]

def value(tree):
if not tree.isLeaf:
raise ArgumentError ("tree is branch")
else:
return tree.value

就是这样。你得到了一个可以用函数访问的纯“代数”数据类型:

def count(bin_tree):
if bin_tree.isLeaf:
return 1
else:
return count(left(bin_tree))+count(right(bin_tree))

关于python - Haskell相当于Python中的数据构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18587421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com