OCaml A ref不会更改其值,尽管我已指示它
我有一个真实的代码,但我制作了这个示例来说明我的问题。 这是代码示例:OCaml A ref不会更改其值,尽管我已指示它,ocaml,Ocaml,我有一个真实的代码,但我制作了这个示例来说明我的问题。 这是代码示例: let ejem n = let count = ref 0 in let rec aum n = if n = 0 then 0 else (count := !count + 1; n + aum (n-1) ) in (aum n, !count) 我尝试在aum函数内更改count值,但是,尽管count在该函数之外,但一旦完成,其值始终为0 请帮助我了解问题所在OCaml不保证表达
let ejem n =
let count = ref 0 in
let rec aum n =
if n = 0 then 0
else (count := !count + 1; n + aum (n-1) )
in (aum n, !count)
我尝试在aum
函数内更改count
值,但是,尽管count
在该函数之外,但一旦完成,其值始终为0
请帮助我了解问题所在OCaml不保证表达式的计算顺序 在最后一行中,您有以下表达式:
(aum n, !count)
OCaml评估是完全合法的!在aum n
之前进行计数,这将给出您看到的结果
要控制评估顺序,您可以使用let
:
let res = aum n in
(res, !count)
除了Jeffrey的答案外,您还可以使用更惯用的incr count
而不是count:=!计数+1
和pred n
而不是n-1
。
这些功能在始终打开的模块中定义。
您甚至可以使用累加器将递归函数aum转换为函数
改进后的ejem功能将是:
let ejem n =
let count = ref 0 in
let rec aum accu n =
if n = 0 then
accu
else (
incr count;
aum (accu + n) (pred n)
)
in
let res = aum 0 n in
(res, !count)