1

OCaml で書かれたプロジェクトを読みましたが、ソース コードがわかりません:

type 'a node = {mutable parent: 'a node; mutable rank: int; label: 'a}

let singleton x = 
     let rec n = {parent=n; rank=0; label=x} in
 n

このコードは素集合の一部ですが、再帰関数がよくわかりません。私は C++ プログラマーだったので、ポインターを使用してオブジェクトを簡単に処理できます。
このコードを OCaml utop で実行すると、結果に驚かされます。多くのノードを生成しました。
このコードは非常に多くのノードを生成するため、多くのメモリを消費しますか?
コンパイラはオーバーフローなしでこれをどのように処理しますか?

4

1 に答える 1

3

多くのノードを作成するのではなく、1 つのノードを作成します。

内部的には、ノードの値はポインターとして表されるためn、その親フィールドに自分自身を指すポインターがあります。これは、C++ でポインタを使用してループ データ構造を作成する方法によく似ています。C++ では常にループを作成するために代入が必要ですが、OCaml では単純なループを再帰によって作成できます。

utop では、1 つの値nが何度も表示されます。OCaml 値プリンターは、内部にループがある場合でも、展開された形式で値を出力します。

于 2013-12-13T02:16:58.057 に答える