2012-09-18 103 views
-1

在Ocaml我有一个“全局”(即有文件范围)数组初始化一些数字,然后我对这些数字做一些操作,然后我调用一个函数来将这些数字求和。现在,因为这个数组是“全局的”,所以我没有费力地将数组作为参数传递,最终发生的是Ocaml计算了初始化数字的总和(在编译时我猜),而不是在对数组进行操作之后已经发生过。我的问题是,为什么会发生这种情况?我花了大约3小时试图追踪错误!这是否与Ocaml的无副作用部分有关?如果是的话,从来没有这样的事情发生的规则是什么?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();; 
+5

我想你需要展示一些展现你所说的行为的代码。一般来说,OCaml中的评估顺序很简单。 (在某些情况下,订单具体是未定义的,但这绝对不是这些之一。) –

+0

更新了代码和修复程序,是我的错误.. – foges

回答

4

OCaml确实没有在“编译时”计算数组元素的总和。有些东西你不了解OCaml评估顺序。很难回答你的问题,因为毫无疑问,它只是告诉我们你在这个话题上有点失落。

这很好,如果我们可以帮助你向你解释的东西。这会有所帮助,但是,如果你能帮助我们在发现您的不解在于,通过:

  • 给人一种小源代码示例如您所愿
  • 解释其行为,你会不会做人预计为什么

了解OCaml的计算顺序一般的事情是,一个模块或文件中,句子进行评估从上到下,当你写let x = a in b表达ab前总是评估,并且函数fun x -> a(或等效形式,如let f x = a)会自行评估,而根本不评估a - 这发生在应用程序时间。

有些人喜欢有一个包含代码所有副作用的“主要”句子。它往往是这样写的是:

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

如果你写了评估代码,并产生你的文件的另一部分的副作用,那么,他们将取决于他们是否是之前或之前或这句话后评估之后。

+0

感谢您澄清。只是认为这是一些编译时优化.. – foges