【发布时间】:2014-10-01 05:37:49
【问题描述】:
考虑面向对象的语言:
大多数具有面向对象编程背景的人都熟悉各种语言中常见且直观的接口,这些接口抓住了 Java 的Collection 和List 接口的精髓。 Collection 指的是不一定具有自然排序/索引的对象集合。 List 是一个具有自然排序/索引的集合。这些接口抽象了 Java 中的许多库数据结构,与其他语言中的等效接口一样,需要深入了解这些接口才能有效地处理大多数库数据结构。
过渡到 Haskell:
Haskell 有一个类型类系统,它作用于类型类似于对象上的接口。当类型涉及功能时,Haskell 似乎有一个关于 Functors、Applicative、Monads 等的well designed type-class hierarchy。他们显然想要correct and well-abstracted type-classes。然而,当您查看许多 Haskell 的容器(List、Map、Sequence、Set、Vector)时,它们几乎都具有非常相似(或相同)的功能,但并未通过类型类进行抽象.
一些例子:
-
null用于测试“空性” -
length/size用于元素计数 -
elem/member用于集合包含 -
empty和/或singleton默认构造 -
union用于设置联合 -
(\\)/diff设置差异 -
(!)/(!!)用于不安全的索引(部分功能) -
(!?)/lookup用于安全索引(全功能)
如果我想使用上述任何函数,但我已经导入了两个或更多容器,我必须开始从导入的模块中隐藏函数,或者仅从模块中显式导入必要的函数,或者限定导入的模块。但由于所有功能都提供相同的逻辑功能,所以看起来很麻烦。如果函数是从类型类定义的,而不是在每个模块中单独定义,编译器的类型推断机制可以解决这个问题。只要它们共享类型类,它还将使切换底层容器变得简单(即:让我们只使用Sequence 而不是List 以获得更好的随机访问效率)。
为什么 Haskell 没有一个 Collection 和/或 Indexable 类型类来统一和概括其中的一些功能? p>
【问题讨论】:
-
简要评论我的近距离投票:因为显然 are 库提供了相关的类型类,在我看来,解释这个问题的最慈善的方式可能是“为什么人们不是在使用这些类型类吗?”。我认为很难以客观、有用的方式回答这个问题。
-
一些心灵的食物:图书馆将如何处理额外的限制?比较
isMember :: Ord k => k -> Set k -> Bool与isMember :: a -> [a] -> Bool。或索引:at :: Int -> [a] -> Maybe avsat :: Unbox a => Int -> Vector a -> Maybe a(用于未装箱的向量)。除此之外,我同意丹尼尔的观点,很难以客观的方式回答。如果您可以创建您的特定版本的Collection,那就去做吧,并将其添加到 hackage。 -
@awashburn: { ... Zeta 评论的副本,已删除 ... } 也就是说,
ConstraintKinds实际上可以实现高效的通用elem。
标签: haskell typeclass abstraction standard-library