为什么Haskell标准库不能更多地使用多态?

时间:2011-01-24 05:50:40

标签: haskell polymorphism generic-programming

我正在学习Haskell,类型类看起来像是一种强大的类型安全多态函数。但是很多Haskell Prelude函数都没有使用它们。更具体地说:

  • 大多数列表函数不适用于其他数据结构(例如,foldrlength仅针对列表实现,不能在数组上使用)。

  • Data.ByteString之类的模块不可用,除非您使用import qualified,因为它们包含与Prelude函数同名的函数。

如果标准库使用带类型类的泛型函数,似乎这两个问题都会消失(如果我完全偏离此基础,请告诉我)。

我有两个问题:

  1. 是否有技术或设计 前奏是这样的原因,还是只是为了 历史原因?

  2. 环顾四周,看起来有一个 几个图书馆(比如 Data.Foldable而且,如果我不是 弄错了,报废你的锅炉) 取代标准Prelude功能 与通用的替代品。是 有没有计划将这些想法纳入Haskell的未来版本?

4 个答案:

答案 0 :(得分:19)

有一个非常好的实用理由,即“标准”Haskell(Prelude + base +可能还有更多)不会使用更多的多态性:

设计通用类型类是。对列表,数组和“字节串”之类的容器类型进行抽象的类的良好设计(我个人并不认为Bytestring是一个容器)不会浮动等待包含在Haskell 2012中。有一些设计,例如Listlike和爱迪生的课程,以及许多人已经解决了这个问题,但除了可折叠和可穿越之外没有人制作过任何引人注目的设计。

答案 1 :(得分:11)

Haskell基础库曾经更具多态性 - 用于任何monad的列表推导,map++不仅限于List,也可能是其他东西。

但当时人们认为这会导致初学者的错误信息混乱,并且不是初学者的人可以使用特定的多态版本。

答案 2 :(得分:8)

  1. 虽然有许多基础,特别是Prelude,这是历史性的,但我认为任何概括都会看到大量的技术推迟。主要问题是速度 - 如果你的函数有一个类型类约束,那么你将要传递类型类函数的字典,并且可能会占用更多的专业化空间。

  2. 某些库(如SYB)使用的扩展名不属于Haskell。第一项任务是正式化并构建对这些功能的支持。查看Haskell的文档,了解Haskell的发展方向以及如何影响该路径。

答案 3 :(得分:6)

真实世界Haskell在Monad Transformers章节中对此有一些见解:

  

在一个理想的世界中,我们是否会从过去中断,并切换Prelude以使用Traversable和Foldable类型?可能不是。学习Haskell对新手来说已经是一个充满激情的冒险经历了。当我们已经理解了仿函数和monad时,可折叠和可遍历的抽象很容易被提取,但它们会让早期学习者过于纯粹的抽象饮食。对于教授语言,地图在列表上运行是好的,而不是在仿函数上运行。