想知道如何在Haskell中定义一个无序的组/集合,其中“集合”是指它可以具有相同元素的许多副本,并且这些项是无序。我知道Haskell中的List
数据类型,但这是固有的顺序。我想看看无序集合/组/列表的定义是什么样的。
答案 0 :(得分:5)
我会这样定义
import qualified Data.Map.Lazy as Map
type MultiSet' a = Map.Map a Int
只是从类型a
到Int
的映射。在数学中,它类似于 f : S -> N 。您放入其中的元素必须是可排序的,这是因为Map
的基础结构是由二叉树定义的。这应该不成问题,因为使用数据结构时您可以将其忘记。有关处理我们的MultiSet'
的功能,请参见非常广泛的documentation of Data.Map。
现在已经有了一个定义和实现的定义,它称为MultiSet。您也可以浏览到其source代码,在那里他们以几乎相同的方式定义了它们(他们使用了地图的 strict 版本)。
或者,您可以使用哈希图,它看起来像这样:
import qualified Data.HashMap.Lazy as Map
type MultiSet'' a = Map.HashMap a Int
放入其中的元素不需要是可排序的,而是可哈希的。
答案 1 :(得分:1)
如果您只想要没有合理顺序的结构,那为什么不使用散列来组成Map?
iPad
上面是一棵平衡的二叉树,其顺序取决于您插入的值的哈希值。地图本身沿type MyBag a = Map (Int,a) Int
insert x mp = Data.Map.insertWith (+) 1 (hash x, x) mp
的线很无聊。
这就是说,我认为您对寻找的东西和希望学习的东西没有明确说明。您的搜索可能产生了哈希表和无序容器-为什么这些信息不足够?