为什么Haskell中没有内置的Set数据类型?

时间:2011-09-26 14:22:36

标签: haskell types set

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

旁注: 我只是学习Haskell作为逻辑课程的一部分,其中集合论非常重要,因此在Haskell中使用集合的概念会非常方便。有一个列表并删除重复项(并可能排序)也会产生一个集合,但我很好奇是否有一个特殊的原因,它不是内置的?

3 个答案:

答案 0 :(得分:28)

正如其他答案所示,问题“为什么Haskell中没有Set数据类型?”被误导:there is a Set data type

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

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

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

注意how similar list comprehension syntax is to set notation。如有必要,您始终可以使用Set.fromList将列表转换为“真实”集。作为对Barry的呐喊,这与使用Python的set()方法类似; Python也有列表推导。

答案 1 :(得分:11)

在更哲学的层面上 - 集合的数学概念与Haskell集合实现之间不可能存在严格的对应关系。为什么不?嗯,类型系统,对于初学者。数学集中可以包含任何内容:{x | x is a positive integer, i < 15}是一个集合,但{1, tree, ham sandwich}也是如此。在Haskell中,Set a需要保留某种特定类型。将双打和浮动放入同一组中将不会进行类型检查。

正如其他人所说,如果你需要做一些类似集合的事情并且不介意类型限制,那么Data.Set就存在了。它不在Prelude中,因为列表通常更实用。但实际上,从语言设计的角度来看,将数学集合视为众多数据集中的一种数据类型是没有意义的。集合比这更重要。你没有集合,数字和列表;你有一组数字和一组列表。递归类型的力量往往会掩盖这种区别,但它仍然是真实的。

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

答案 2 :(得分:9)

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