Удаление элемента по указанному индексу не является типичной операцией в функциональном программировании - поэтому кажется трудным найти правильную реализацию этих операций. В функциональном программировании вы обычно обрабатываете список поэлементно, используя рекурсию, или реализуете обработку в терминах декларативных операций более высокого уровня. Возможно, если бы вы могли уточнить, в чем ваша мотивация, мы могли бы дать лучший ответ.
В любом случае, для реализации двух требуемых операций вы можете использовать существующие функции более высокого порядка (которые обходят весь список несколько раз, потому что на самом деле нет хорошего способа сделать это без обхода списка):
let removeAt index input =
input
// Associate each element with a boolean flag specifying whether
// we want to keep the element in the resulting list
|> List.mapi (fun i el -> (i <> index, el))
// Remove elements for which the flag is 'false' and drop the flags
|> List.filter fst |> List.map snd
Чтобы вставить элемент в указанный индекс, вы можете написать:
let insertAt index newEl input =
// For each element, we generate a list of elements that should
// replace the original one - either singleton list or two elements
// for the specified index
input |> List.mapi (fun i el -> if i = index then [newEl; el] else [el])
|> List.concat
Однако, как отмечалось ранее - если у вас нет очень веских причин для использования этих функций, вам, вероятно, следует рассмотреть более широкое описание ваших целей и использовать альтернативное (более функциональное) решение.