簡介
在計算機
程式語言中,
遞歸類型(又名:
遞歸定義、
隱含類型或
隱含定義)是一種特殊的
數據類型,它表示自身內部可能包含其它的同樣類型的值。
範例
data List a = Nil | Cons a (List a)
這表示a的鍊表s可以是一個空表或一個cons單元包含了一個'a'(鍊表的“頭”)和另一個鍊表(“尾”)。
遞歸不允許在
Miranda語言中和Haskell的同義類型中出現,所以以下的Haskell類型是非法的:
type Bad = (Int, Bad) type Evil = Bool -> Evil
相反地,表面上是相等的代數數據類型卻是可以的:
data Good = Pair Int Good data Fine = Fun (Bool->Fine)
相互遞歸數據類型
數據類型也可以通過相互遞歸來定義。最重要的基本示例是
樹,可以根據森林(樹木列表)相互遞歸地定義樹。象徵:
f: [t[1], ..., t[k]]t: v f
森林f由樹木列表組成,而樹木t由一對值v和森林f(其子)組成。這個定義是優雅的,並且易於抽象地工作(例如當證明有關樹的屬性的定理時),因為它用簡單的術語表示樹:一種類型的列表和一種兩種類型的對。
通過內聯林的定義,可以將此相互遞歸定義轉換為單個遞歸定義:
樹t由一對值v和樹列表(它的孩子)組成。這個定義更緊湊,但有點混亂:一棵樹由一對類型和另一種類型組成,需要解開才能證明結果。
在標準ML中,樹和林數據類型可以相互遞歸地定義如下,允許空樹:
datatype 'a tree = Empty | Node of 'a * 'a forestand 'a forest = Nil | Cons of 'a tree * 'a forest