29

我正在学习 Haskell,类型类似乎是制作类型安全的多态函数的强大方法。但是很多 Haskell Prelude 函数并没有使用它们。进一步来说:

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

  • 除非您使用,否则类似Data.ByteString的模块无法使用,import qualified因为它们包含与 Prelude 函数同名的函数。

如果标准库使用带有类型类的泛型函数,这两个问题似乎都会消失(如果我完全不理解这个,请告诉我)。

我有两个问题:

  1. Prelude 是这样的有技术或设计原因,还是仅仅是历史原因?

  2. 环顾四周,似乎有几个库( Data.Foldable如果我没记错的话,比如 Scrap Your Boilerplate)用通用替代品替换标准 Prelude 函数。是否有计划将这些想法融入到 Haskell 的未来版本中?

4

4 回答 4

19

“标准”Haskell(Prelude + base + 也许更多)不使用更多的多态性有一个很好的实用理由:

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

于 2011-01-24T09:19:39.223 回答
11

Haskell 基础库过去更具有多态性——列表推导曾经适用于任何 monad,map并且++不仅限于 List,也许还有其他东西。

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

于 2011-01-25T05:52:00.183 回答
8
  1. 虽然基础中有很多东西,特别是 Prelude,但我认为任何概括都会看到很多技术上的回击。主要问题是速度 - 如果您的函数具有类型类约束,那么您将传递类型类函数的字典,并且可能会为专业化占用更多空间。

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

于 2011-01-24T06:10:47.050 回答
6

Real World Haskell 在Monad Transformers章节中对此有一些见解:

在理想的世界中,我们是否会与过去决裂,并切换 Prelude 以使用 Traversable 和 Foldable 类型?可能不是。学习 Haskell 对于新手来说已经是一次足够刺激的冒险了。当我们已经了解函子和单子时,可折叠和可遍历抽象很容易上手,但它们会使早期学习者过于纯粹地抽象抽象。对于语言教学,最好 map 对列表进行操作,而不是对函子进行操作。

于 2011-01-24T11:50:20.617 回答