Вы не можете изменять переменные в OCaml (ну, есть способ, но вы не должны делать простые вещи, подобные этому)
Основной прием, который вы можете сделать, - это создать вспомогательную функцию, которая получает дополнительныеаргументы, соответствующие переменным, которые вы хотите "мутировать".Обратите внимание, как я добавил дополнительный параметр для i
, а также "изменил" заголовок текущего списка аналогичным образом.
let rec index_helper (x, vs, i) =
match vs with
[] -> -1
| (curr::rest) ->
if(curr == x) then
i
else
index_helper (x, rest, i+1)
;;
let index (x, vs) = index_helper (x, vs, 0) ;;
Этот вид хвостово-рекурсивного преобразования является способом преобразования циклов в функциональныепрограммирование, но, если честно, это своего рода низкий уровень (у вас есть полная мощность, но ручная рекурсия похожа на программирование с помощью gotos ...).
Для некоторых конкретных шаблонов вместо этого вы можете попытаться воспользоватьсямногократно используемых функций высшего порядка, таких как map или folds.