1


0

再帰データ型を使用してMLで関数を作成する方法

指定されたデータ型:

datatype bunch = One of int
               | Group of bunch list;
datatype 'ex bunch = NIL
                   | One of 'ex
                   | Group of 'ex * 'ex bunch;

たとえば、この再帰関数の合計を返す関数を設計するにはどうすればよいですか。 私は再帰関数を定義する方法とわずかに使用する方法を理解していますが、「exがデータ型の束をオンラインでどのように変更するか、または他の参照のいずれかの指示を見つけることができません。

1 Answer


0


2番目の定義では、「bunch」データ構造を_polymorphic_にします。つまり、あらゆるタイプのデータを含めることができます。 たとえば、 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;

次の関数は、任意の要素タイプ(そのタ​​イプ ’a bunch→ int`で示される)を使用して、バンチ内の要素の数を計算します。 このようなポリモーフィック関数を定義できる理由は、操作するためにバンチの要素の内部を見る必要がないためです。

fun bunch_count NIL = 0
  | bunch_count (One x) = 1
  | bunch_count (Group (x, b)) = 1 + bunch_count b;

(本番プログラムでは、このような関数は、末尾再帰アルゴリズムを使用して、あまり明確ではないがリソースをあまり消費しない方法で作成する必要があります。)

バンチタイプはリストとほぼ同型なので、実装の標準リストライブラリのソースを見てインスピレーションを得ることができます。