Удалить элемент из списка в f #

Предположим, у меня есть отсортированный список l с возможными повторяющимися значениями - и я хочу вернуть список со значением n, удаленным из l, но только один раз. - например, для входов [1,2,3,3,3,4] и 3, возврат [1,2,3,3,4]. Как мне это сделать?

3 ответа

Самый простой подход был бы примерно таким:

let rec remove n lst = match lst with | h::tl when h = n -> tl | h::tl -> h :: (remove n tl) | [] -> []

Вы рекурсивно пересекаете список, пока не найдете n - если вы это сделаете, вы уроните его и верните хвост. Обратите внимание, что это не хвостовая рекурсия, но ее можно легко сделать.


Для тех, кого это интересует (я знаю, что я был), я придумал версию принятого ответа с помощью хвоста с использованием аккумулятора, так как я новичок в F # и очень ржавый с моей рекурсивной работой.

let remove n list = let rec removeTail n list acc = match list with | h::tl when h = n -> List.append (List.rev acc) tl | h::tl -> (removeTail n tl (h::acc)) | [] -> List.rev acc removeTail n list []

Ресурсы, которые я использовал:


Прежде чем List.distinct доступен, вы можете использовать Seq.distinct:

let l = [1;1;2;3;3;3;4]
let dl = l |> Seq.ofList |> Seq.distinct |> Seq.toList

В F # 4.0 у нас будет List.distinct, как объявлено здесь:

В F # 4.0 API-интерфейсы коллекций полностью нормализованы в массиве, списке и Seq. В настоящее время выделены, оптимизированы реализации всех общих операций для каждого типа и даже несколько совершенно новых функций. Это представляет собой добавление колоссальных 95 API в целом.

licensed under cc by-sa 3.0 with attribution.