Один из способов перехода от императивного к функциональному взгляду на вещи - представить, что каждая переменная, которую вы хотите изменить, является параметром функции.Когда вы хотите изменить значение переменной, вы вызываете функцию, передающую новое значение.
Это может звучать безумно (или, возможно, это не так), но на самом деле все работает в 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