Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 从f中的列表中删除元素#_F#_Tail Recursion_F# 3.0 - Fatal编程技术网

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

F# 从f中的列表中删除元素#,f#,tail-recursion,f#-3.0,F#,Tail Recursion,F# 3.0,假设我有一个排序列表l,可能有重复的值-我想返回一个列表,其中的值n从l中删除,但只返回一次。-例如,对于输入[1,2,3,3,4]和3,返回[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—

假设我有一个排序列表l,可能有重复的值-我想返回一个列表,其中的值n从l中删除,但只返回一次。-例如,对于输入[1,2,3,3,4]和3,返回[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
——如果找到,则删除它并返回尾部。请注意,这不是尾部递归,但很容易实现。

在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。

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


您是指
系统.集合.通用.分类列表
?或者(假定已排序)不可变F#list?不可变F#list。我编辑这个问题是为了让这个问题更清楚。你问的问题仍然不清楚-当前的措辞表明你想要一个函数,它接受一个列表
l
和一个值
n
,从列表中删除值
n
,并返回
l
的所有其他元素(包括
n
的潜在副本)作为一个数组。这就是你想要的吗?是的,我提高了问题的清晰度以反映这一点。输出实际上应该是一个列表(我无意中放入了数组,对不起),您可以很容易地使用list.fold,其中累加器是简单的bool。这会让它变成尾巴recursive@MichalMa:您是指累加器为输出列表+布尔标志的折叠?这是可行的,但使用fold时,您必须将列表遍历到底,这是不必要的。通过一个简单的更改,我的意思是引入一个带累加器的内部函数来构建列表。看起来不错,但您也希望在空列表中返回反向的
acc
。@scrwtp谢谢,感谢您提供了最初的答案。这不是OP想要的答案。