为什么 Data.Map 中的键被限制为 class Ord?

Why is the key in Data.Map constrained to class Ord?

假设我定义了这样一个简单类型:

data Object = House | Table | Book

为了能够将 Object 用作映射的键​​,类型必须从 EqOrd:

派生
data Object = House | Table | Book deriving (Eq, Ord)

此限制的原因是什么?为什么地图的键需要可排序?

Data.Map 为大多数操作(插入、查找、删除...)提供 O(log N) 复杂度。它可以做到这一点,因为它在内部使用平衡搜索树。反过来,这需要键的排序关系,因此需要 Ord 约束。 EqOrd 的超类,因此也必须提供。

只有 Eq 我们不能像查找一样高效,因为在这种情况下我们能做的最好的事情就是执行线性搜索,即 O(N)。

没有 Eq,我们根本无法执行查找,因为我们无法将已插入的键与要查找的键进行比较。