是否有用于从列表中删除项目的公开函数?
我没有看到任何从列表中删除项目的操作。
我确信我可以自己实现此功能。但是,我有点期望在FSharp.Core中支持此操作。
我错过了什么吗?
答案 0 :(得分:6)
如果您的意思是创建一个新列表,其中某些项目会根据其值删除,那么您可以执行此操作:
[1; 2; 3; 1] |> List.filter ((<>) 1)
// Returns [2; 3]
这在前缀模式中使用<>
(不等于)运算符,将它包装在括号中,然后通过仅提供第一个参数来对其进行currying。
请注意,此值的所有实例都将被排除。
答案 1 :(得分:5)
简短回答 - 图书馆设计师并不认为它有理由包含在内。
设计任何类型的库,特别是像F#中的集合模块这样的核心库,总是要在复杂性和实用性之间找到适当的平衡点。您必须仔细考虑您的新功能是否足以支持表格,以抵消拥有更大库的成本。
要删除项目的所有实例,可以将List.filter
与否定谓词一起使用。设计者可以包含一个List.remove
函数,在内部进行否定。这不是不可想象的事实,事实上Lisps往往同时拥有filter
和remove
。在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
方法。