有没有人可以向我解释为什么Haskell中没有定义Set
数据类型?为什么Haskell中没有内置的Set数据类型?
旁注: 我只是在学习Haskell作为集合论非常重要的逻辑课程的一部分,因此在Haskell中拥有集合的概念将非常方便。有一个列表和删除重复(可能排序)会导致一组,但我很好奇,如果有一个特定的原因,为什么它不是内置的?
有没有人可以向我解释为什么Haskell中没有定义Set
数据类型?为什么Haskell中没有内置的Set数据类型?
旁注: 我只是在学习Haskell作为集合论非常重要的逻辑课程的一部分,因此在Haskell中拥有集合的概念将非常方便。有一个列表和删除重复(可能排序)会导致一组,但我很好奇,如果有一个特定的原因,为什么它不是内置的?
正如其他答案指出的那样,“为什么Haskell中没有设置数据类型?”被误导:there is a Set data type。
如果你想知道为什么Set
不是“内置”给Haskell的,你可能会问两件事之一。
Set
不是language specification的一部分?Set
不在Prelude(默认导入的函数和数据类型)?要回答前者,这是因为该语言足够强大,足以表达一个集合的概念,而无需将其烘焙。作为一种高度重视函数式编程的语言,元组和列表的特殊语法内置,但即使简单的数据类型,如Bool
在Prelude中定义。
为了回答后者,再一次强调函数式编程,大多数Haskeller倾向于使用列表。列表monad表示非确定性选择,并且通过允许重复,您可以表示加权选项。
备注how similar list comprehension syntax is to set notation。必要时,您总是可以使用Set.fromList
将列表转换为“真实”组。作为对Barry的beg sh声,这与使用Python的set()
方法相似; Python也具有列表解析功能。
从技术上讲,'Data.Set'在GHC中,但它不在GHC中的Haskell 98或2010报告中 – user102008
@ user102008“?它在[Haskell Platform](http://hackage.haskell.org/platform/)中包含的[containers package](http://hackage.haskell.org/package/containers)中,我不确定你的意思是说它在“GHC”中。 –
@DanBurton,即使你没有获得平台,GHC也可以使用'containers'软件包。 – ivanm
在更哲学的层面---一个集合的数学概念和一个Haskell集合实现之间永远不可能存在严格的对应关系。为什么不?那么,类型系统,对于初学者来说。一个数学集可以有任何东西:{x | x is a positive integer, i < 15}
是一组,但也是{1, tree, ham sandwich}
。在Haskell中,Set a
需要保存某种特定的类型。将双精度和浮点数放入同一个集合将不会检测。正如其他人所说,如果你需要做一些类似设置的事情,不介意类型限制,Data.Set存在。它不在Prelude中,因为列表通常更实用。但实际上,从语言设计的角度来看,把数学集作为一种数据类型是没有意义的。集合比这更基础。你没有集合,数字和列表;你有一组数字和一组列表。递归类型的力量往往掩盖了这种区别,但它仍然是真实的。
虽然在Haskell中有一个地方,我们定义任意集合,然后在这些集合上定义函数。 Haskell中最接近的集合数学概念是类型系统本身。
很多时候,数学中的集合被认为是在“宇宙”(http://en.wikipedia.org/wiki/Universe_(mathematics))的背景下 – user102008
@Zopa:你仍然可以用sum-类型。 – ivanm
的确如你所说,“在Haskell中,一个'Set a'需要保存某种特定的类型”。但是'a'实例化的类型可能是一种存在类型,其中'1''''''''''''''''''''''''''''''''''''''''''''''''''假设'树'和'火腿三明治'本身是很好的类型术语......你可以用这样的一套有意义的方式来做这件事我不知道;)但是我同意你的结论,那就是_types本身_是Haskell对数学集合的概念最接近的东西。 –
**版主说明**这个问题下的评论主要是噪音,或对噪音的反应,他们已被删除。请保持评论建设性和主题。 –
我看到建议使用列表的答案/评论。一份清单并不是一套有效的替代品。在无序列表中查找元素的时间随着列表大小的增加而增加,在一个集合中,预计会保持不变。 – ribamar