我们知道,在Haskell中,一组元素由Data.Set
模块中的二进制搜索树表示,这很有效。但是,大多数操作都要求elememt是Ord
类的实例。
但是,一般集不需要其elememt即可成为Ord
的实例。由于集合中没有重复的元素,因此将其元素作为Eq
类的实例就足够了。
在Haskell中,我只能想到单个链表的实现,就像默认的[a]
一样,但是单个链表的效率不如BST,而BST需要{{1 }}类。
顺便说一句,在Python中,Ord
类不需要其元素是可排序的。仅定义set
和__eq__
(与Haskell的__ne__
类相对应)即可,例如:
Eq
?: x =水果('苹果')
?: y =水果('苹果')
?: z =水果('Apple')
?: {x,y,z}
{Apple}
?: x <= y
回溯(最近通话最近一次):
文件“”,模块中的第1行
class Fruit: def __init__(self, name): self.name = name.title() def __repr__(self): return self.name def __eq__(self, other): return self.name == other.name # defines the equality operation def __ne__(self, other): return self.name != other.name # defines the unequality operation def __hash__(self): return hash(self.name) # so that Fruit instance can be an element of a set
TypeError:“水果”和“水果”的实例之间不支持“ <=”
所以我想知道Haskell中是否有一些有效的数据结构可以用来表示x <= y
,但不需要Set
类。
答案 0 :(得分:3)
Python在作弊。 All values in Python are hashable and set()
is just a dictionary with no value.
Python可以避免这种情况,因为它是动态类型化语言的副作用。使Python跟踪其变量类型的机制也很容易在其上施加伪指令。
Haskell作为一种静态类型的语言,尤其是具有一流功能的静态类型的语言,不能为数据类型发明任意顺序。因此,Data.Set
要求Ord
高效。无需订购就将新值添加到集合将变为O(n)。