再帰的に定義されたデータ型 (もしくは再帰的データ型と略します) とは、そのコンストラクタがそのデータ型自身の値に適用するような値を作ることです。 例えば次に宣言するデータ型 charlst は再帰的です:
文字と charlst の型の値に適用されると、 charlst_cons コンストラクタは charlst 型の値を作ります。 例として、次の値は 'a', 'b', 'c' から成る文字のリストを表現しています: 与えられたリストの長さを算出する関数 charlst_length を次のように定義できます: この実装は再帰ですが、末尾再帰ではないことに注意してください。 整数の加法の交換法則と結合法則を使って、 charlst_length を次のように末尾再帰で実装することができます: この本では命名規約として、 末尾再帰関数にのみ loop という名前を割り当てることに注意してください。 C言語のような命令型プログラミング言語のループに変換することができないので、 末尾再帰でない関数は loop と呼ぶことはできません。