Переменная счетчик в Ocaml? - PullRequest
       10

Переменная счетчик в Ocaml?

0 голосов
/ 02 октября 2018

Если вы не можете использовать изменяемые состояния в Ocaml, как бы вы сделали создание переменной счетчика в рекурсивной функции.Например:

Скажем, у вас есть тип данных e, который вы хотите, чтобы шаблон соответствовал выражению (этого типа данных) рекурсивно.

Match expression (e: example) : int
|O(i) -> int x + 1

Так что в этом примере (другие случаи намеренно пропущены)), если вы найдете O (i), вы хотите, чтобы ваш int x увеличился с 0, + 1 + 2 + 3 ...

Когда я пытаюсь реализовать это, он говорит "unbound value int".Итак, как бы вы создали переменную, которая может меняться с каждой итерацией.

Извините, если это не имеет смысла.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я не совсем уверен, что вы спрашиваете, и какой синтаксис вы используете (это не OCaml), но, так как вы упомянули «рекурсию» и «переменную счетчика», я собираюсь сделать попытку на иллюстрациикак увеличить счетчик во время рекурсии, используя этот пример, который создает список с числами от a до b включительно:

let rec range a b =
    if a > b then
        []
    else
        a :: range (a + 1) b

Для каждой итерации значение a будет увеличиваться на 1 доон достигает b, и список создается путем добавления a к заголовку списка, сгенерированного путем рекурсивного выполнения range с увеличением a.

0 голосов
/ 02 октября 2018

Один из способов перехода от императивного к функциональному взгляду на вещи - представить, что каждая переменная, которую вы хотите изменить, является параметром функции.Когда вы хотите изменить значение переменной, вы вызываете функцию, передающую новое значение.

Это может звучать безумно (или, возможно, это не так), но на самом деле все работает в FP.

Вот некоторый императивный код для подсчета количества раз, которое число 5 появляется в списке целых чисел:

 let how_many_5s l =
     let rest = ref l in
     let count = ref 0 in
     while !rest <> [] do
          if List.hd !rest = 5 then
              count := !count + 1;
          rest := List.tl !rest
     done;
     !count

Вот функциональный код, который делает то же самое.Переменные, которые изменены в приведенном выше коде, оставшийся список и счетчик, являются параметрами внутренней функции.

 let how_many_5s_functional list =
     let rec inner count list =
         match list with
         | [] -> count
         | 5 :: t -> inner (count + 1) t
         | _ :: t -> inner count t
     in
     inner 0 list
...