-1

Ocamlでは、いくつかの数値で初期化された「グローバル」(つまり、ファイルスコープを持つ)配列があり、次にそれらの数値に対していくつかの操作を実行し、次にそれらの数値を合計する関数を呼び出します。この配列は「グローバル」であるため、わざわざ配列を引数として渡す必要はありませんでした。結局、Ocamlは、配列を操作した後ではなく、初期化された数値の合計を計算しました(コンパイル時だと思います)。起こった。私の質問は、なぜこれが起こるのかということです。私はバグを追跡するために約3時間を費やしました!これはOcamlの副作用のない部分と関係がありますか?もしそうなら、このようなことが起こらないようにするためのルールは何ですか?

ありがとう

編集:あなたたちは非常に正しいです、私は基本的に台無しにした。これは本質的に私のコードでした

let my_array = Array.make 10 0;;

let sum_array = ...;;

let my_fun = 
  do_stuff_with_array args;
  sum_array;;

もちろん、sum_array事前に計算されていました。これに変更して機能しましたが、これが最善の解決策ですか?

let my_array = Array.make 10 0;;

let sum_array _ = ...;;

let my_fun = 
  do_stuff_with_array args;
  sum_array ();;
4

1 に答える 1

4

OCaml は確かに、「コンパイル時に」配列の要素の合計を計算しませんでした。OCaml の評価順序について、あなたが理解していないことがあります。本当に質問がないので、あなたの質問に答えるのは難しいです。このトピックについて少し迷っていることを示しているだけです。

私たちがあなたに物事を説明することによってあなたを助けることができれば、これは結構です. ただし、次の方法で、あなたの理解不足がどこにあるのかを特定するのを手伝っていただけると助かります。

  • 期待どおりに動作しない小さなソースコードの例を与える
  • 予想される動作とその理由を説明する

OCaml の評価順序について知っておくべき一般的なことは、モジュールまたはファイルでは、文は上から下に評価されることlet x = a in b、式を記述するときaは常に の前に評価されるbこと、および関数fun x -> a(または のような同等の形式let f x = a) が評価されることです。それ自体、aまったく評価せずに -- これはアプリケーション時に発生します。

コードのすべての副作用を含む「メイン」センテンスを好む人もいます。次のように書かれることが多いです。

let () =
   (* some code that does side-effect *)

ファイルの他の部分で副作用を評価して生成するコードを記述した場合、それらはこの文の前か後かに応じて、この文の前または後に評価されます。

于 2012-09-18T20:25:34.703 に答える