2 番目の定義は、bunch
データ構造を多態性にします。つまり、任意の型のデータを含めることができます。たとえば、Group (3, One 2)
はint bunch
であり、Group ("three", One "two")
はstring bunch
です。値NIL
には、任意の型を表す型'a bunch
があり'a
ます (つまりNIL
、型int bunch
と型string bunch
と ... があります)。
「この再帰関数の合計を返す」という目標は意味がありません。再帰関数がありません。「この帰納的なデータ構造の合計を返す」という意味であったとしても、何を求めているのかはまだ明確ではありません。数値の集合ではないデータ構造の合計が何を意味するのかについて、より正確にする必要があります。
次の関数は、 の整数の合計を計算しますint bunch
。ML インタープリターに入力するとわかるように、その型は ですint bunch -> int
。つまり、整数の束に対してのみ作用します (そうでなければ、+
演算子は意味をなさないでしょう)。
fun bunch_sum NIL = 0
| bunch_sum (One x) = x
| bunch_sum (Group (x, b)) = x + bunch_sum b;
次の関数は、任意の要素タイプ (その type で示される'a bunch -> int
) を持つ束の要素数を計算します。このような多態性関数を定義できる理由は、操作するために束の要素の内部を調べる必要がないためです。それはパラメトリックに多態性です。
fun bunch_count NIL = 0
| bunch_count (One x) = 1
| bunch_count (Group (x, b)) = 1 + bunch_count b;
(本番プログラムでは、このような関数は、末尾再帰アルゴリズムを使用して、明確ではないがリソースを消費しない方法で記述する必要があります。)
束の型はリストとほぼ同形であるため、実装の標準リスト ライブラリのソースを参照してインスピレーションを得ることができます。