По сути, вам нужно два аккумулятора для отслеживания текущего индекса и максимального индекса, найденного для элемента. Затем вы просто возвращаетесь к концу списка и возвращаете значение «максимального индекса».
let rindex elem =
let rec find_index i max_found = function
| (x::xs) when x = elem -> find_index (i+1) i xs
| (_::xs) -> find_index (i+1) max_found xs
| [] -> max_found
in find_index 0 (-1);;
Это также может быть выражено довольно просто как сгиб:
let rindex elem ls =
let find_index (i, max) elem' = (i+1, if elem' = elem then i else max)
in snd (fold_left find_index (0, -1) ls);;