如何在Haskell中定义无序集合

时间:2019-03-05 05:38:22

标签: haskell

想知道如何在Haskell中定义一个无序的组/集合,其中“集合”是指它可以具有相同元素的许多副本,并且这些项是无序。我知道Haskell中的List数据类型,但这是固有的顺序。我想看看无序集合/组/列表的定义是什么样的。

2 个答案:

答案 0 :(得分:5)

我会这样定义

import qualified Data.Map.Lazy as Map

type MultiSet' a = Map.Map a Int 

只是从类型aInt的映射。在数学中,它类似于 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 的线很无聊。

这就是说,我认为您对寻找的东西和希望学习的东西没有明确说明。您的搜索可能产生了哈希表和无序容器-为什么这些信息不足够?