在从C#世界迁移到F#(最符合习惯的)思维方式时,我发现了这个有趣的差异。
在C#的OOP&可变世界中,默认的集合似乎是未排序的 HashSet,因为它接受的比较器仅用于相等性;而如果你想要一个排序的集合,则必须使用 SortedSet。
然而,在F#的世界中,基本的set
已经排序,因为它需要用于实现相等性和比较的元素类型。有没有特定的原因?为什么不在该语言的主要集合中拥有无序集合?
作为旁注,我想知道是否可能有一个集合,它不允许重复项,但对于某些元素具有优先选择,当舍弃某些元素作为重复项时。例如:一个记录 { Name: string; Flag: Option<unit> }
,当插入 { Name = "foo"; Flag = None }
后,再插入 { Name = "foo"; Flag = Some() }
时,它最终仅包含后一个元素(因为Flag存在)。
HashSet
设计为可变的,因此其实现优化了这种情况。而 F# 不是这样的。 - mjwills