11

OCamlで関数を定義する前に関数を宣言する方法はありますか?私はOCamlインタープリターを使用しています。

私には2つの機能があります:

let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *)

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)

ただし、myFunctionAは作成される前にmyFunctionBを呼び出すことができないため、これは機能しません。

私はいくつかのグーグル検索をしましたが、何も見つからないようです。どうすればこれを達成できますか?

4

2 に答える 2

24

必要なのは、これら2つの関数を相互に再帰的にすることです。「let...let ...」を使用する代わりに、次のように「let rec ...and...」を使用する必要があります。

let rec myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *)

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)
于 2011-09-30T16:58:44.543 に答える
2

実際、「let rec ..」には非常に深刻な制限があります。これは、単一のモジュール内でのみ機能します。これにより、プログラマーは望ましくない場所に大きなモジュールを作成する必要があります。低Cでは発生しない問題です。

いくつかの回避策がありますが、すべて不十分です。1つは、関数型の変数を作成し、最初に例外を発生させる関数を格納し、次に目的の値を格納することです。

2つ目は、クラスタイプとクラス(および1つの間接参照)を使用することです。相互に再帰的な関数がたくさんある場合は、これが最善の方法です(それぞれに1つのオブジェクトを渡すだけでよいため)。

最も簡単で醜いのは、関数を引数として相互に渡すことです。これは、急速に制御不能になるソリューションです。すべての定義に従うモジュールでは、「let rec」ラッパーのセットを導入することにより、呼び出し元のコードを簡略化できます。残念ながら、これは関数の定義に役立ちません。また、ほとんどの呼び出しがそのような定義で発生するのが一般的です。

于 2011-10-30T16:30:56.453 に答える