Solución:
Puede que no te des cuenta, pero List.nth
La función ya está en el módulo Lista.
Si desea escribirlo usando recursividad:
let rec get_nth = function
| [], _ -> raise (Failure "get_nth")
| _, n when n < 0 -> raise (Invalid_argument "get_nth")
| x::_, 0 -> x
| x::xs, n -> get_nth(xs, n-1)
El uso de tuplas como parámetros como este no es común en OCaml. Por lo general, usaría curry y definiría su función de esta manera:
let get_nth list n = ...
Esto tendría la firma 'a list -> int -> 'a
. También tenga en cuenta que tiene un 'a
paramter aquí, lo que significa que no hay una razón real para restringir su función solo a ints.
Ahora veamos el problema. Si desea obtener el elemento cero, ¿cómo sería su función?
let get_nth list 0 = List.head list (* this is not actually valid in OCaml *)
ahora, si tiene una función para obtener el n-ésimo elemento de una lista de m elementos (NB n> m), ¿cómo podría usar esa función para construir otra función que obtenga el n + 1er elemento de una lista de m + 1 elementos? Sea esa función para n + 1 elementos get_nth'
let get_nth' list n' = get_nth (List.tail list) (n'-1)
Ahora todo lo que necesita hacer es combinar los dos y listo. Dejaré la última parte en tus manos.
Si sigue este consejo, obtendrá algo que es más complicado de lo que tiene que ser. Sin embargo, es más fácil comprender lo que está sucediendo de esta manera.
(En mi opinión) Una solución más simple sin usar una tupla puede ser:
let rec get_nth mylist index = match mylist with
| [] -> raise (Failure "empty list")
| first::rest ->
if index = 0 then first
else get_nth rest (index-1)
;;