Нет, в стандартной библиотеке List нет библиотечной функции, но не так уж сложно ее кодировать.
Вот нерекурсивная реализация.
(** [insert n el lst] inserts element [el] in the [n]th position in the
list [lst].
Raises: [Failure] if index is out of bounds *)
let rec insert n el lst =
match n,lst with
| i, _ when i >= List.length lst -> failwith "Index out of Bounds"
| _, [] -> []
| 0, _::t -> el::(insert (-1) el t)
| i, h::t -> h::(insert (i-1) el t)
Идея состоит в том, чтобы сопоставить образцы с n
и lst
вместе.
Если вы нажмете пустой список, верните начальное значение (или аккумулятор, если вы хотите получить хвостовое рекурсивное решение).
Если n
достигнет 0, добавьте элемент в списоки продолжайте просматривать остальную часть списка, чтобы сохранить другие элементы (но убедитесь, что вы никогда не нажмете снова 0, поэтому я использовал -1
).
В противном случае вы добавляете старые элементысписок, пока n
не достигнет 0.