2011-09-26 75 views
15

有没有人可以向我解释为什么Haskell中没有定义Set数据类型?为什么Haskell中没有内置的Set数据类型?

旁注: 我只是在学习Haskell作为集合论非常重要的逻辑课程的一部分,因此在Haskell中拥有集合的概念将非常方便。有一个列表和删除重复(可能排序)会导致一组,但我很好奇,如果有一个特定的原因,为什么它不是内置的?

+3

**版主说明**这个问题下的评论主要是噪音,或对噪音的反应,他们已被删除。请保持评论建设性和主题。 –

+0

我看到建议使用列表的答案/评论。一份清单并不是一套有效的替代品。在无序列表中查找元素的时间随着列表大小的增加而增加,在一个集合中,预计会保持不变。 – ribamar

回答

26

正如其他答案指出的那样,“为什么Haskell中没有设置数据类型?”被误导:there is a Set data type

如果你想知道为什么Set不是“内置”给Haskell的,你可能会问两件事之一。

要回答前者,这是因为该语言足够强大,足以表达一个集合的概念,而无需将其烘焙。作为一种高度重视函数式编程的语言,元组和列表的特殊语法内置,但即使简单的数据类型,如Bool在Prelude中定义。

为了回答后者,再一次强调函数式编程,大多数Haskeller倾向于使用列表。列表monad表示非确定性选择,并且通过允许重复,您可以表示加权选项。

备注how similar list comprehension syntax is to set notation。必要时,您总是可以使用Set.fromList将列表转换为“真实”组。作为对Barry的beg sh声,这与使用Python的set()方法相似; Python也具有列表解析功能。

+0

从技术上讲,'Data.Set'在GHC中,但它不在GHC中的Haskell 98或2010报告中 – user102008

+0

@ user102008“?它在[Haskell Platform](http://hackage.haskell.org/platform/)中包含的[containers package](http://hackage.haskell.org/package/containers)中,我不确定你的意思是说它在“GHC”中。 –

+0

@DanBurton,即使你没有获得平台,GHC也可以使用'containers'软件包。 – ivanm

9

它存在为Data.Set。然而,正如你所说,它可以在list之上实现,因此不需要来构建语言,我认为这就是为什么它在模块中而不是语言本身定义的一部分。

+0

那么,列表也可以使用其他的东西来定义... –

+0

@DietrichEpp是的,但如果你添加到列表作为一个明确的缺点链的话,语法将非常沉重。 – mb14

+1

@ mb14'(:) == Cons';对于显式有限列表和作为各种'枚举{From} {Then} {To}'函数的包装,只有语法糖。 – ivanm

11

在更哲学的层面---一个集合的数学概念和一个Haskell集合实现之间永远不可能存在严格的对应关系。为什么不?那么,类型系统,对于初学者来说。一个数学集可以有任何东西:{x | x is a positive integer, i < 15}是一组,但也是{1, tree, ham sandwich}。在Haskell中,Set a需要保存某种特定的类型。将双精度和浮点数放入同一个集合将不会检测。正如其他人所说,如果你需要做一些类似设置的事情,不介意类型限制,Data.Set存在。它不在Prelude中,因为列表通常更实用。但实际上,从语言设计的角度来看,把数学集作为一种数据类型是没有意义的。集合比这更基础。你没有集合,数字和列表;你有一组数字和一组列表。递归类型的力量往往掩盖了这种区别,但它仍然是真实的。

虽然在Haskell中有一个地方,我们定义任意集合,然后在这些集合上定义函数。 Haskell中最接近的集合数学概念是类型系统本身。

+1

很多时候,数学中的集合被认为是在“宇宙”(http://en.wikipedia.org/wiki/Universe_(mathematics))的背景下 – user102008

+0

@Zopa:你仍然可以用sum-类型。 – ivanm

+0

的确如你所说,“在Haskell中,一个'Set a'需要保存某种特定的类型”。但是'a'实例化的类型可能是一种存在类型,其中'1''''''''''''''''''''''''''''''''''''''''''''''''''假设'树'和'火腿三明治'本身是很好的类型术语......你可以用这样的一套有意义的方式来做这件事我不知道;)但是我同意你的结论,那就是_types本身_是Haskell对数学集合的概念最接近的东西。 –

相关问题