Functional programming Ocaml操作是按顺序执行的
在Ocaml中,我有一个用一些数字初始化的“全局”(即has file scope)数组,然后对这些数字执行一些操作,然后调用一个函数将这些数字相加。现在,因为这个数组是“全局的”,我没有费心把数组作为参数传递,结果是Ocaml计算了初始化的数字之和(我猜是在编译时),而不是在我对数组进行操作之后。我的问题是,为什么会发生这种情况?我花了大约3小时的时间来追踪这个虫子!这和Ocaml的无副作用部分有关吗?如果是这样的话,那么永远不要发生这种事情的规则是什么 谢谢 编辑:你们说得很对,我从根本上搞砸了。这基本上是我的代码Functional programming Ocaml操作是按顺序执行的,functional-programming,ocaml,Functional Programming,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评估顺序,您还不了解一些东西。很难回答你的问题,因为实际上没有问题,它只是告诉我们你对这个话题有点迷茫 如果我们能帮助你向你解释一些事情,这是很好的。但是,如果您能通过以下方式帮助我们发现您的不理解之处,这将有所帮助:
- 给出一个小的源代码示例,它的行为与您期望的不一样
- 和解释您预期的行为以及原因
let x=a时,表达式a
总是在b
之前求值,函数fun x->a
(或类似的形式,如let f x=a
)计算到自身,而根本不计算a
——这在应用程序时发生
有些人喜欢使用包含代码所有副作用的“主”语句。它通常是这样写的:
let () =
(* some code that does side-effect *)
如果您编写的代码在文件的其他部分进行计算并产生副作用,那么,它们将在这句话之前或之后进行计算,具体取决于它们是在这句话之前还是之后。我认为您需要显示一些显示您所说行为的代码。一般来说,OCaml中的求值顺序很简单。(在某些情况下,顺序是明确未定义的,但这听起来肯定不像是其中之一。)用代码和修复更新,这是我的错误。感谢澄清。我只是假设这是某种编译时优化。。