尽管我指示 OCaml A ref 不会改变它的值

OCaml A ref does not change its value despite I instructed it

我有一个真实的代码,但我制作了这个示例来说明我的问题。 这是代码示例:

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 之前评估 !count 是完全合法的,这将给出您看到的结果。

要控制评估顺序,您可以使用 let:

let res = aum n in
(res, !count)

除了 Jeffrey 的回答之外,您还可以使用更惯用的 incr count 而不是 count := !count + 1pred n 而不是 n - 1。 这些函数定义在始终打开的 Stdlib 模块中。
您甚至可以使用累加器将递归函数 aum 转换为 tail-recursive 函数。

改进后的 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)