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 能夠很方便地支持遞歸數據結構的定義和操作。