#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)
Я пытаюсь изменить count
значение внутри aum
функции, но, несмотря count
на то, что находится вне этой функции, ее значение всегда 0
остается неизменным после ее завершения.
Пожалуйста, помогите мне понять, в чем проблема
Ответ №1:
OCaml не гарантирует какого-либо определенного порядка вычисления выражений.
В вашей последней строке у вас есть это выражение:
(aum n, !count)
Для OCaml совершенно законно оценивать значение !count
перед aum n
, что даст результат, который вы видите.
Для управления порядком вычисления вы можете использовать let
:
let res = aum n in
(res, !count)
Ответ №2:
В дополнение к ответу Джеффри вы могли бы использовать более идиоматическое incr count
вместо count := !count 1
и pred n
вместо n - 1
. Эти функции определены в всегда открытом модуле Stdlib.
Вы даже можете преобразовать рекурсивную функцию 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)