从 f# 中的列表中删除元素

Remove element from list in f#

假设我有一个排序列表 l,可能有重复值 - 我想 return 一个列表,其中值 n 从 l 中删除,但只删除一次。 - 例如,对于输入 [1,2,3,3,3,4] 和 3,return [1,2,3,3,4]。我该怎么做?

最直接的方法是这样的:

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

您递归地遍历列表直到找到 n - 如果找到,则将其丢弃并 return 尾部。请注意,这不是尾递归,但可以很容易地做到这一点。

在 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 宣布 here :

在 F# 4.0 中,集合 API 已在 Array、List 和 Seq 中完全规范化。现在,每种类型的所有常见操作都有专门的、优化的实现,甚至还有一些全新的功能。这表示总共增加了 95 APIs。

对于那些感兴趣的人(我知道我是),我想出了一个使用累加器的已接受答案的尾部优化版本,因为我是 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 []

我使用的资源: