为什么 F# Set 需要 IComparable?

Why does F# Set need IComparable?

所以我尝试使用 F# 集作为散列 table。但是我的元素类型没有实现 IComparable 接口(尽管它实现了 IEquatable)。我收到一条错误消息,说由于比较约束不允许构造。通过进一步阅读,我发现 F# Set 是使用二叉树实现的,这使得插入原因 O(log(n))。这在我看来很奇怪,为什么 Set 结构要这样设计?

编辑:所以我了解到 F# 中的 Set 实际上是 SortedSet。我想问题变成了,为什么 Sorted Set 作为 immutable/functional 数据结构比一般的 Hash Set 更可取?

有两个要点可以帮助您了解 F#(以及一般的函数式语言)中的集如何工作以及如何使用它们:

  • 实现不可变哈希表(如 .NET HashSet)很难 - 当您删除或添加元素时,您希望避免复制数据结构中的所有内容并且(据我所知) ) 没有通用的方法来做到这一点(你最终会复制太多,所以效率很低)。

    出于这个原因,大多数功能集被实现为(某种形式的树)。这些需要比较才能构建排序树。平衡树的好处 属性 是删除和添加元素不必复制树中的所有内容,因此即使是最坏的情况也是相当有效的(尽管可变哈希表仍然更快)。

  • 现在,F# 是功能优先的,这意味着不可变结构是首选,但使用可变数据结构是完全没问题的(特别是如果您将使用限制在某些明确定义和受限的范围内).为此,F# 程序员经常使用 DictionaryHashSet,尤其是当这仅在单个函数的范围内时。