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)