Я написал рекурсивную версию индекса следующим образом
let index list value =
let rec counter num = function
| [] -> -1
| h::t ->
if h == value
then num
else (counter (num + 1)) t
in counter 0 list;;
Это работает, но затем наш профессор сказал, что мы должны использовать хвостовую рекурсивную версию, чтобы не было тайм-аута на сервере, поэтому я написал новую индексную функцию, используя fold, но я не могу понять, почему, если она не находит элемент, он возвращает число больше, чем длина списка, хотя я хочу, чтобы он возвращал -1.
let index2 list value = fold (fun i v ->
if i > (length list) then -1
else if v == value then i
else i+1) 0 list;;
Вот и моя складная версия:
let rec fold f a l = match l with
[] -> a
| (h::t) -> fold f (f a h) t;;
==
— это физическое равенство (что хорошо для целых чисел), но вы, вероятно, имели в виду=
. - person nlucaroni   schedule 28.03.2014index
является хвостовой рекурсией. - person Martin Jambon   schedule 28.03.2014