Использование кортежей в качестве таких параметров не является обычным явлением в OCaml. Обычно вы используете каррирование и определяете свою функцию следующим образом:
let get_nth list n = ...
Это будет иметь подпись 'a list -> int -> 'a
. Также обратите внимание, что здесь у вас есть параметр 'a
, что означает, что нет никакой реальной причины ограничивать вашу функцию только одними целыми.
Теперь давайте посмотрим на проблему. Если вы хотите получить нулевой элемент, как бы выглядела ваша функция?
let get_nth list 0 = List.head list (* this is not actually valid in OCaml *)
Теперь, если у вас есть функция для получения n-го элемента из списка из m элементов (NB n> m), как вы можете использовать эту функцию для создания другой функции, которая получает n + 1-й элемент из списка из m + 1 элемент? Пусть эта функция для n + 1 элементов будет get_nth'
let get_nth' list n' = get_nth (List.tail list) (n'-1)
Теперь все, что вам нужно сделать, это объединить два, и все готово. Я оставлю эту последнюю часть на ваше усмотрение.
Если вы последуете этому совету, вы получите нечто более сложное, чем должно быть. Однако так легче понять, что происходит.