是否有从列表中删除项目的公开功能?

时间:2016-07-27 15:28:14

标签: list f#

是否有用于从列表中删除项目的公开函数?

我没有看到任何从列表中删除项目的操作。

我确信我可以自己实现此功能。但是,我有点期望在FSharp.Core中支持此操作。

我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

如果您的意思是创建一个新列表,其中某些项目会根据其值删除,那么您可以执行此操作:

[1; 2; 3; 1] |> List.filter ((<>) 1)

// Returns [2; 3]

这在前缀模式中使用<>(不等于)运算符,将它包装在括号中,然后通过仅提供第一个参数来对其进行currying。

请注意,此值的所有实例都将被排除。

答案 1 :(得分:5)

简短回答 - 图书馆设计师并不认为它有理由包含在内。

设计任何类型的库,特别是像F#中的集合模块这样的核心库,总是要在复杂性和实用性之间找到适当的平衡点。您必须仔细考虑您的新功能是否足以支持表格,以抵消拥有更大库的成本。

要删除项目的所有实例,可以将List.filter与否定谓词一起使用。设计者可以包含一个List.remove函数,在内部进行否定。这不是不可想象的事实,事实上Lisps往往同时拥有filterremove。在Haskell和OCaml中,你只有filter - 而F#设计师可能会在这里效仿。

如果您只想删除项目的单个实例,则必须自己编写一些内容。对于列表来说,这是一个有点非标准的用例 - 列表是“关于”按顺序累积元素;从列表中间移除特定元素(与移除头部或移除所有不需要的元素相反)很少有用。如果你的重点是添加或删除元素而不需要保留顺序,那么集合或映射(用作多重集合)更适合工作。

答案 2 :(得分:1)

我不确定你为什么会这么想。例如,相同的功能(AFAIK)不适用于C#中的数组。

但是,如果您需要,可以使用通用列表:

open System.Collections.Generic

let xs = [1..3]
let xs' = List(xs)
xs'.Remove(2)
xs' 
//val it : List<int> = seq [1; 3]

通用列表包含.Remove.RemoveAt.RemoveAll方法。