Haskell 支持递归数据结构,其中最常见的方式是使用代数数据类型。代数数据类型允许定义自己的数据类型,其中可以包含构造器,这些构造器可以包含递归引用自身的类型。例如,下面是一个定义二叉树的代数数据类型的例子:
data BinaryTree a = Leaf
| Node a (BinaryTree a) (BinaryTree a)
在这个例子中,BinaryTree
是一个代数数据类型,其中包含两个构造器:Leaf
表示空叶子节点,Node
表示一个包含值和两个子树的节点。这里的 BinaryTree a
是递归定义的,因为 Node
构造器的参数是 BinaryTree a
类型。
使用递归数据结构时,你可以使用递归函数来处理这些数据结构。例如,下面是一个计算二叉树叶子节点数的函数:
countLeaves :: BinaryTree a -> Int
countLeaves Leaf = 1
countLeaves (Node _ left right) = countLeaves left + countLeaves right
在这个例子中,countLeaves
函数递归地遍历二叉树,如果遇到叶子节点则返回 1,否则递归地计算左右子树的叶子节点数并相加。
通过代数数据类型和递归函数,Haskell 能够很方便地支持递归数据结构的定义和操作。