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)
 

Я пытаюсь изменить 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)