Удалить элемент из списка в 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.