尽管我指示 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 + 1
和 pred 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)
我有一个真实的代码,但我制作了这个示例来说明我的问题。 这是代码示例:
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 + 1
和 pred 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)