Haskell 数据集:它总是知道得最好吗?

Haskell 数据集:它总是知道得最好吗?,haskell,Haskell,我需要表示一个集合,然后开始使用Data.set。我发现其实没什么可做的-singleton,union,intersection等等都在那里。我喜欢。我可以表达“什么”,而不是“如何”。但是我内心的C程序员很不舒服。有很多方法可以实现集合(二叉树、散列、布尔数组等)。我真的可以信任数据吗?集合选择最好的一个?我可以用某种方式来引导它吗,还是我只是屈服于它(我承认,可能更高级)的判断?常规数据。Set使用一个平衡的二叉树。如果有整数集或位向量集,则需要使用Patricia tries的Data.

我需要表示一个集合,然后开始使用Data.set。我发现其实没什么可做的-
singleton
union
intersection
等等都在那里。我喜欢。我可以表达“什么”,而不是“如何”。但是我内心的C程序员很不舒服。有很多方法可以实现集合(二叉树、散列、布尔数组等)。我真的可以信任数据吗?集合选择最好的一个?我可以用某种方式来引导它吗,还是我只是屈服于它(我承认,可能更高级)的判断?

常规
数据。Set
使用一个平衡的二叉树。如果有整数集或位向量集,则需要使用Patricia tries的
Data.IntSet

这两种实现都经过多年的竞争磨练,以获得Haskell可能的最佳性能


投降多萝西

Data.Set
没有内部智能(请参见!)。它只是一个平衡树或有序元素。您可以在hackage上查找其他许多具有不同性能特征的set和set-like结构。例如,请参阅(HashSet)和。

使用选项2,特别是在生产代码中使用时。这与Thomas的答案结合在一起形成了一个很好的答案<代码>数据.Set很棒,界面很棒,在大多数情况下速度足够快(比我们任何人都能用手滚动的速度快得多),但是(像所有事情一样),它不能以最佳方式解决所有问题。在你需要之前不要担心它;当您这样做时,请查看其他一些库。@luqui我认为当您有整数集时,直接转到
Data.IntSet
。好的,谢谢。我想接下来的问题是-是否存在或将来是否会存在一个
Data.Set
,可以信任它为调用方做出一些实现选择?i、 e.当被告知域只是[1..8]时,它会发现它只能使用一个字节?因为值都是装箱的,所以你不能让它只使用一个字节。您将如何在Haskell中实现这一点?我想您应该检查输入的值并手动设置
Word8
中的位,然后为每次查找分配一个装箱值?对我来说,这听起来不像是一个性能上的胜利。似乎你仍然可以在不进行任何分配的情况下进行集合相等比较,也许只需分配一个单词就可以进行并集和交集比较8。@gcbenison:是的,出于某种原因,我想到的是映射/查找操作,而不是集合/成员身份。如果您认为您可以创建一套能够智能地选择表示的实现,那么我会鼓励您这样做,对其进行基准测试,与社区交流,完善API,并上传到Hackage。在这个社区仍然有很多低挂果实,只是对Haskell来说,“低挂”已经从“周末项目”升级到“长达数月的中等到认真的努力”。@gcbenison别忘了GHC有时会优化这些东西。