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

时间:2015-01-27 22:08:20

标签: f# tail-recursion f#-3.0

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

3 个答案:

答案 0 :(得分:6)

最直接的方法是这样的:

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

您递归遍历列表,直到找到n - 如果您这样做,则将其删除并返回尾部。请注意,这不是尾递归,但可以轻松实现。

答案 1 :(得分:1)

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

我用过的资源:

答案 2 :(得分:-1)

在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中,我们将按照宣布here

的方式获得List.distinct

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