繁体   English   中英

为什么F#的列表类型没有删除功能?

[英]Why F#'s List type doesn't have a Remove function?

我不明白为什么F#的List具有一个append函数(以不可变的友好方式返回另一个列表),却不具有remove函数(我对将T用作参数的函数特别感兴趣,不是index:int,所以不是removeAt )。

为什么会这样呢?

在这种情况下,“为什么”通常是“因为没有人实施”。 但是在这种情况下,我推测这可能也是一种设计选择。 考虑一下:

  • F#List是不可变的,因此remove函数将必须返回新的list值。
  • 与使用map及其Map.remove key或set and Set.remove item ,通常您不假定列表元素具有相等性,因此包括List.remove且对项目具有相等性约束将破坏该假设。

鉴于这一信息, List.remove只会是一个别名List.filter ((<>) item) ,所以你可以使用来代替。

这似乎是理所当然的,但是为什么要反复从List删除项目呢? 我的意思是,如果您希望在拥有filter后将其删除,但是如果您需要重复执行此操作,则List可能不是您应该使用的集合,因为性能会很糟糕( O(n^2)复杂度)。 因此,我认为最好不要在List提供remove ,这样人们就不会错误地选择他们将要使用的收藏类型,这间接地鼓励人们了解收藏选择的隐患。 毕竟,F#中的List是一个链表,而不仅仅是C#中的数组包装器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM