再帰データ型

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

再帰データ型または再帰型(Recursive Type)とは、プログラミング言語におけるデータ型の一種であり、同型の複数の値を含む構造になっているデータ型を指す。

[編集]

例として、Haskell言語でのリスト型を示す:

data List a = Nil | Cons a (List a)

これは、リスト a は空のリストの場合と 'a' を先頭に持つリストの場合があることを示している。

MirandaやHaskellの型シノニム宣言では再帰は許されていないので、以下のような Haskell での型定義は不正である:

type Bad = (Int, Bad)
type Evil = Bool -> Evil

逆に、見た目は等価に思える代数データ型は正当であり利用可能である:

data Good = Pair Int Good
data Fine = Fun (Bool->Fine)

理論[編集]

型理論では、再帰データ型の一般形は μα.T で表される。ここで型変数 α は型そのものであると共に、型 T の中にも現われる可能性がある。

例えば、自然数を Haskell のデータ型として表すと次のようになる(ペアノの公理参照):

  data Nat = Zero | Succ Nat

また、型理論では nat = \mu \alpha. 1 + \alpha となる。ここでは、Zero と Succ コンストラクタで表現されており、Zero は引数をとらず(型理論の定義の \alphaに相当)、Succ は別の Nat を引数としている(型理論での定義の1 + \alphaに相当)。

再帰データ型には、同形再帰データ型(isorecursive type)と等価再帰データ型(equirecursive type)の2つの形式がある。これらは、再帰データ型の定義における項の排除の仕方に違いがある。

同形再帰データ型[編集]

同形再帰データ型では、再帰データ型 \mu \alpha . T とその拡張(展開)である T[\mu \alpha.T / \alpha] は別の型であり、特殊な項構成 rollunroll で識別され、これらの間で同型写像を構成する。正確に記せば、roll : T[\mu\alpha.T/\alpha] \to \mu\alpha.Tunroll : \mu\alpha.T \to T[\mu\alpha.T/\alpha] であり、これらは互いに逆関数である。

等価再帰データ型[編集]

等価再帰規則では、再帰データ型 \mu \alpha . T とその展開 T[\mu\alpha.T/\alpha] は「等価」である。ここで等価とは、この2つの型表現が同じ型を表していると理解されることを示す。実際、等価再帰型の理論ではさらに、無限に展開したときに等価となる2つの型表現は等価であるとするのが一般的である。このような規則の結果として、等価再帰データ型は同形再帰データ型よりも遥かに複雑な型システムを提供する。型検査のようなアルゴリズム上の問題や型推論も等価再帰データ型の方が難しい。

等価再帰データ型は、自己参照形式や相互参照形式の型定義が可能である。これは手続き的かつオブジェクト指向言語ではオブジェクトやクラスの型理論的意味論問題を生じる。関数型言語では、同形再帰データ型がはるかに普遍的に使われている。

関連項目[編集]

この記述は GNU Free Documentation License のもとに公開されているコンピュータ用語辞典『 Free On-line Dictionary of Computing (FOLDOC) 』に基づいています。