Functional programming Ocaml操作是按顺序执行的

Functional programming Ocaml操作是按顺序执行的,functional-programming,ocaml,Functional Programming,Ocaml,在Ocaml中,我有一个用一些数字初始化的“全局”(即has file scope)数组,然后对这些数字执行一些操作,然后调用一个函数将这些数字相加。现在,因为这个数组是“全局的”,我没有费心把数组作为参数传递,结果是Ocaml计算了初始化的数字之和(我猜是在编译时),而不是在我对数组进行操作之后。我的问题是,为什么会发生这种情况?我花了大约3小时的时间来追踪这个虫子!这和Ocaml的无副作用部分有关吗?如果是这样的话,那么永远不要发生这种事情的规则是什么 谢谢 编辑:你们说得很对,我从根本上搞

在Ocaml中,我有一个用一些数字初始化的“全局”(即has file scope)数组,然后对这些数字执行一些操作,然后调用一个函数将这些数字相加。现在,因为这个数组是“全局的”,我没有费心把数组作为参数传递,结果是Ocaml计算了初始化的数字之和(我猜是在编译时),而不是在我对数组进行操作之后。我的问题是,为什么会发生这种情况?我花了大约3小时的时间来追踪这个虫子!这和Ocaml的无副作用部分有关吗?如果是这样的话,那么永远不要发生这种事情的规则是什么

谢谢

编辑:你们说得很对,我从根本上搞砸了。这基本上是我的代码

let my_array = Array.make 10 0;;

let sum_array = ...;;

let my_fun = 
  do_stuff_with_array args;
  sum_array;;
所以当然,
sum_数组
是事先计算出来的。把它改成这个,它就成功了,这是最好的解决方案吗

let my_array = Array.make 10 0;;

let sum_array _ = ...;;

let my_fun = 
  do_stuff_with_array args;
  sum_array ();;

OCaml肯定没有“在编译时”计算数组元素的总和。关于OCaml评估顺序,您还不了解一些东西。很难回答你的问题,因为实际上没有问题,它只是告诉我们你对这个话题有点迷茫

如果我们能帮助你向你解释一些事情,这是很好的。但是,如果您能通过以下方式帮助我们发现您的不理解之处,这将有所帮助:

  • 给出一个小的源代码示例,它的行为与您期望的不一样
  • 解释您预期的行为以及原因
关于OCaml求值顺序,一般要知道的是,在一个模块或文件中,句子是从上到下求值的,当您在b中编写
let x=a时,表达式
a
总是在
b
之前求值,函数
fun x->a
(或类似的形式,如
let f x=a
)计算到自身,而根本不计算
a
——这在应用程序时发生

有些人喜欢使用包含代码所有副作用的“主”语句。它通常是这样写的:

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

如果您编写的代码在文件的其他部分进行计算并产生副作用,那么,它们将在这句话之前或之后进行计算,具体取决于它们是在这句话之前还是之后。

我认为您需要显示一些显示您所说行为的代码。一般来说,OCaml中的求值顺序很简单。(在某些情况下,顺序是明确未定义的,但这听起来肯定不像是其中之一。)用代码和修复更新,这是我的错误。感谢澄清。我只是假设这是某种编译时优化。。