跳转到内容

另一个 Haskell 教程/前言

来自维基教科书,开放世界中的开放书籍
Haskell
另一个 Haskell 教程
前言
简介
入门
语言基础 (解决方案)
类型基础 (解决方案)
IO (解决方案)
模块 (解决方案)
高级语言 (解决方案)
高级类型 (解决方案)
单子 (解决方案)
高级 IO
递归
复杂度

另一个 Haskell 教程的目标是提供对 Haskell 编程语言的完整介绍。它假设你对 Haskell 语言没有任何了解,也不熟悉函数式编程。但是,对编程概念(例如算法)的一般了解将有所帮助。这不是旨在介绍一般的编程;而是介绍 Haskell 中的编程。你还需要熟悉你的操作系统和文本编辑器(本报告只讨论了 Windows 和 *Nix 系统上的安装和配置;其他操作系统可能受支持——请参阅你选择的编译器的文档,以了解有关在其他平台上安装的更多信息)。

什么是 Haskell?

[编辑 | 编辑源代码]

Haskell 被称为一种惰性、纯函数式编程语言。它被称为惰性,因为不需要确定问题答案的表达式不会被求值。惰性的反义词是严格,这是大多数常见编程语言(C、C++、Java,甚至 ML)的求值策略。严格语言是指所有表达式都被求值的语言,无论其计算结果是否重要。(这可能并不完全正确,因为针对严格语言的优化编译器通常会进行所谓的“死代码消除”——这会从程序中删除未使用的表达式。)Haskell 被称为,因为它不允许副作用(副作用是影响世界“状态”的东西。例如,一个打印到屏幕上的函数被称为有副作用,同样,影响全局变量值的一个函数也是有副作用的)——当然,没有副作用的编程语言将毫无用处;Haskell 使用单子系统来将所有不纯计算从程序的其余部分隔离出来,并以安全的方式执行它们(参见本章 单子 以了解单子的讨论,或者参见本章 IO 以了解如何在纯语言中进行输入/输出)。

Haskell 被称为函数式语言,因为程序的求值等同于从纯粹的数学意义上求值一个函数。这也与标准语言(如 C 和 Java)不同,标准语言按顺序执行一系列语句(这被称为命令式语言)。

Haskell 的历史

[编辑 | 编辑源代码]

Haskell 的历史最好用作者的话来描述。以下文字摘自已发布的 Haskell 98 报告。

1987 年 9 月,在俄勒冈州波特兰举行的函数式编程语言和计算机体系结构会议(FPCA '87)上举行了一次会议,讨论了函数式编程社区中一个不幸的状况:当时已经出现了十多种非严格的纯函数式编程语言,它们在表达能力和语义基础方面都非常相似。会议上达成了一致意见,认为缺乏一种通用语言阻碍了这类函数式语言的广泛使用。会议决定成立一个委员会来设计这种语言,以实现更快地传播新想法、为真实应用程序开发提供稳定的基础,并鼓励更多人使用函数式语言。本文档描述了该委员会努力的结果:一种名为 Haskell 的纯函数式编程语言,以逻辑学家 Haskell B. Curry 的名字命名,他的工作为我们的大部分工作提供了逻辑基础。

该委员会的主要目标是设计一种满足以下约束条件的语言

  1. 它应该适用于教学、研究和应用,包括构建大型系统。
  2. 它应该通过发布正式的语法和语义来完整地描述。
  3. 它应该可以免费获得。任何人都被允许实现该语言并将其分发给任何人。
  4. 它应该基于得到广泛共识的想法。
  5. 它应该减少函数式编程语言中不必要的差异。

该委员会希望 Haskell 成为未来语言设计研究的基础,并希望语言的扩展或变体能够出现,并包含实验性功能。

自最初发布以来,Haskell 的确不断发展。到 1997 年中,该语言设计已经迭代了四次(当时最新的版本是 Haskell 1.4)。在 1997 年阿姆斯特丹举行的 Haskell 研讨会上,人们决定需要一个稳定的 Haskell 变体;这个稳定的语言是本报告的主题,被称为“Haskell 98”。

Haskell 98 被认为是对 Haskell 1.4 的相对较小的整理,进行了一些简化,并消除了一些对新手而言的陷阱。它旨在成为一种“稳定”语言,从这个意义上说,实现者承诺在可预见的未来准确地支持 Haskell 98,如规范所述。

最初的 Haskell 报告只涵盖了语言本身,以及一个名为 Prelude 的标准库。到 Haskell 98 稳定为止,很明显许多程序需要访问更大的一组库函数(特别是涉及输入/输出和与操作系统的简单交互)。如果这些程序要可移植,那么一组库也必须标准化。因此,由一个不同的(但重叠的)委员会开始了一项单独的努力来修复 Haskell 98 库。

为什么要使用 Haskell?

[编辑 | 编辑源代码]

很明显你对 Haskell 感兴趣,因为你正在阅读本教程。使用 Haskell 有很多动机。我个人使用 Haskell 的原因是我发现使用 Haskell 比使用任何其他语言,我能够在更短的时间内编写出更多无错误的代码。我还发现它非常易读且可扩展。

然而,也许最重要的是,我一直发现 Haskell 社区非常乐于助人。该语言一直在不断发展(这并不意味着它不稳定;而是说已经添加了若干扩展到一些编译器中,我发现这些扩展非常有用),并且用户建议在实施新扩展时通常会被采纳。

为什么不使用 Haskell?

[编辑 | 编辑源代码]

我最大的两个抱怨,也是我认识的大多数 Haskell 程序员的抱怨,是:(1)生成的代码往往比用 C 等语言编写的等效程序速度慢;(2)调试起来往往很困难。

第二个问题往往不是一个大问题:我编写的大多数代码都没有错误,因为大多数其他语言中常见的错误来源在 Haskell 中根本不存在。第一个问题在我以往的经验中确实出现过几次;然而,CPU 时间几乎总是比程序员时间便宜,如果我不得不花更多的时间等待结果,而之前已经节省了几天的时间进行编程和调试,那也是可以接受的。

当然,并非所有应用程序都如此。有些人可能会发现使用 Haskell 带来的速度损失是不可接受的。但是,Haskell 拥有一个标准化的 _外部函数接口_,它允许你链接其他语言编写的代码,当你需要从代码中获得最大速度时。如果你觉得这还不够,我建议你看看 OCaml 语言,这种语言的性能往往 _超过_ 甚至 C++,但也拥有 Haskell 的许多优点。

目标受众

[编辑 | 编辑源代码]

关于 Haskell 已经写了很多书和教程;要查看一个(几乎)完整的列表,请访问 Haskell 主页的 Haskell 文档。对现有教程的简要调查得出

  • Haskell 入门 是 Haskell 的入门教程,假设读者熟悉函数式编程。
  • Haskell 伴侣 是常见概念和定义的简短参考。
  • 在线 Haskell 课程 是一个简短的课程(德语),用于开始学习 Haskell。
  • 二十四个简短的 Haskell 课 是一个优秀的教科书的草稿,强调用户的参与。
  • Haskell 教程 基于第三届高级函数式编程国际暑期学校的课程。
  • 面向 Miranda 程序员的 Haskell 假设读者了解 Miranda 语言。

虽然所有这些教程都非常优秀,但它们本身并不完整:“入门”对 Haskell 初学者来说过于高级,而其他教程往往结束得太早,或者没有涵盖所有内容。Haskell 对新手程序员和有经验的非函数式程序员来说都充满了陷阱,这可以从阅读 Haskell 邮件列表的档案中得到证明。

很明显,迫切需要一种教程,它在入门意义上不假设读者了解函数式编程,但在高级意义上假设读者具有一定的编程背景。此外,已知的教程都没有早点介绍输入/输出和交互性(Paul Hudak 的书是个例外,它在第 35 页介绍了 IO,尽管这本书和本教程的重点和目标非常不同)。本教程不适合初学者;假设读者具有一定的编程和计算机知识(尽管附录包含一些背景信息)。

Haskell 语言经历了一个标准化过程,结果被称为 Haskell 98。本书的大部分内容将涵盖 Haskell 98 标准。任何与标准的偏差都将予以说明(例如,许多编译器提供了标准的某些扩展,这些扩展很有用;其中一些可能会在本文中讨论)。

本教程的目标是

  • 首先要 _实用_
  • 提供一个全面、免费的 Haskell 语言入门
  • 指出常见的陷阱及其解决方法
  • 提供对 Haskell 如何在现实世界中使用的良好理解




其他在线信息来源

[编辑 | 编辑源代码]

如果不感谢 Haskell 的最初设计者,那就是不合适的。他们是:Arvind、Lennart Augustsson、Dave Barton、Brian Boutel、Warren Burton、Jon Fairbairn、Joseph Fasel、Andy Gordon、Maria Guzman、Kevin Hammond、Ralf Hinze、Paul Hudak、John Hughes、Thomas Johnsson、Mark Jones、Dick Kieburtz、John Launchbury、Erik Meijer、Rishiyur Nikhil、John Peterson、Simon Peyton Jones、Mike Reeve、Alastair Reid、Colin Runciman、Philip Wadler、David Wise、Jonathan Young。

最后,我要特别感谢 Simon Peyton Jones、Simon Marlow、John Hughes、Alastair Reid、Koen Classen、Manuel Chakravarty、Sigbjorn Finne 和 Sven Panne,他们一直支持我学习 Haskell,让我的人生更加愉快。当然还有其他人也提供了帮助,但没有列出来,不过这些是我想到的。

还要感谢许多人报告了第一版中的“错误”。

- Hal Daumé III

华夏公益教科书