4

パラメータ、つまり「次元」に依存する多くの機能をモジュールに持つ OCaml プログラムがあります。このパラメーターは、コードの実行の開始時に一度決定され、終了まで一定のままです。

私の質問は、私の関数がすべて「次元」パラメーターを必要としないように、コードを短く書くにはどうすればよいかということです。これらのモジュールは相互に関数を呼び出すため、モジュール間に厳密な階層はありません (または、私にはわかりません)。

この問題に対処するための ocaml スタイルはどのようになっていますか? ファンクターを使用する必要がありますか、それとも他の手段がありますか?

4

1 に答える 1

3

おそらく、モジュール間の依存関係を壊さずにパラメーターを評価することはできません。それ以外の場合は、他のモジュールからアクセスできるモジュールの 1 つでパラメーターを定義するだけです。私の頭に浮かぶ解決策は、少し「大胆」です。パラメーターを遅延値として定義し、その中で「グローバル セル」の逆参照を一時停止します。

let hidden_box = ref None
let initialize_param p =
  match !hidden_box with None -> hidden_box := Some p | _ -> assert false
let param =
  lazy (match !hidden_box with None -> assert false | Some p -> p)

欠点はLazy.force param、少し冗長なことです。

ETA: 「モジュール間に厳密な階層はありません」は次のいずれかであることに注意してください。

  1. 偽、または
  2. 再帰的なモジュール定義がある、または
  3. どこかで再帰的な結び目を結んでいます。

(2) の場合、すべてをファンクターに入れることができます。(3) の場合、既にパラメーターを渡しています。

于 2013-10-30T17:59:42.337 に答える