文章
Get Programming with Haskell-2
Foundations of functionalprogramming
目录
1、Foundations of functional programming#
有两种主要方式可以理解编程行为。第一种,也是历史上更常见的一种观点,认为程序员向计算机提供一系列指令,以使其以某种方式运行。这种编程模型将程序员与特定编程工具(即计算机)的设计联系起来。在这种类型的编程中,计算机是一种接受输入、访问内存、向处理单元发送指令并最终向用户提供输出的设备。这种计算机模型被称为冯·诺依曼架构,以著名数学家和物理学家约翰·冯·诺依曼命名。 最能体现这种程序思维方式的编程语言是 C。C 程序从操作系统控制的标准输入中获取数据,在物理内存中存储和检索经常必须手动管理的必要值,需要处理指向特定内存块的指针,最后通过操作系统控制的标准输出返回所有输出。在编写 C 程序时,程序员必须对手头的问题和面前的计算机的物理架构有尽可能多的了解。 但采用冯·诺依曼架构构建的计算机并不是执行计算的唯一方式。人类执行各种各样的计算,这些计算与内存分配和指令集无关:对书架上的书籍进行分类、求解微积分中函数的导数、为朋友指路等等。当我们编写 C 代码时,我们正在针对特定的计算实现进行编程。领导 Fortran 创建团队的约翰·巴克斯 (John Backus) 在他的图灵奖演讲中问道:“编程能否摆脱冯·诺依曼风格?” 这个问题引出了理解编程的第二种方式,这也是本书第一单元的主题。函数式编程试图将编程从冯·诺依曼风格中解放出来。函数式编程的基础是抽象的、数学的计算概念,超越了特定的实现。这导致了一种编程方法,通常只需描述问题即可解决问题。通过专注于计算而不是计算机,函数式编程允许程序员访问强大的抽象,从而使许多具有挑战性的问题更容易解决。 这样做的代价是入门会困难得多。函数式编程中的想法往往很抽象,我们必须从基本原理开始构建编程的想法。在构建有用的程序之前,我们需要学习许多概念。在学习第一个单元时,请记住,您正在学习一种超越计算机编程的方式进行编程。 正如 C 是冯·诺依曼编程风格的近乎完美的体现,Haskell 是您可以学习的最纯粹的函数式编程语言。作为一种语言,Haskell 完全致力于 Backus 的梦想,不允许您回到更熟悉的编程风格。这使得学习 Haskell 比学习许多其他语言更困难,但学习 Haskell 使您不可能不深入了解函数式编程。到本单元结束时,您将拥有足够强大的函数式编程基础,以了解所有其他函数式编程语言的基础知识,并为学习 Haskell 的旅程做好准备。
2、Functions and functional programming#
学习 Haskell 时,你需要了解的第一个主题是,什么是函数式编程?函数式编程以难以掌握而闻名。虽然这无疑是事实,但函数式编程的基础却出奇地简单。你需要学习的第一件事是函数式编程语言中函数的含义。你可能已经很清楚使用函数的含义。在本课中,你将看到函数在 Haskell 中必须遵循的简单规则,这些规则不仅使你的代码更易于推理,而且还会带来全新的编程思维方式。
1、Functions#
在 Haskell 中,函数的工作方式与数学中的完全相同。下图显示了一个名为 simple 的函数。
Haskell 中的所有函数都遵循三条规则,这些规则迫使它们的行为类似于数学中的函数:
- 所有函数必须携带参数.
- 所有函数必须有返回值.
- 任何时候传入相同的参数给函数,函数都必须返回相同的结果. 第三条规则是函数基本数学定义的一部分。当同一参数必须始终产生相同结果的规则应用于编程语言中的函数时,它被称为引用透明性(referential transparency)。
2、Functional programming#
如果函数只是从一堆 x(即 x 的复数形式 — “exes”)到一堆 y(即 y 的复数形式 — “whys”)的映射,那么它们与编程有什么关系?20 世纪 30 年代,一位名叫 Alonzo Church 的数学家试图创建一个仅使用函数和变量(xs 和 ys)的逻辑系统。这种逻辑系统称为 lambda 演算。在 lambda 演算中,你将所有内容表示为函数:true 和 false 是函数,甚至所有整数都可以表示为函数。 Church的目标最初是解决数学领域集合论中的一些问题。不幸的是,lambda 演算并没有解决这些问题,但丘奇的工作却带来了一些更有趣的东西。事实证明,lambda 演算可以实现一种通用的计算模型,相当于图灵机! 这一关于 lambda 演算和计算之间关系的发现被称为Church-Turing论题。这一发现的奇妙之处在于,您拥有一个数学上合理的编程模型! 您使用的大多数编程语言都是出色的工程成果,但 无法保证程序将如何运行。有了数学基础,Haskell 能够从您编写的代码中删除所有类型的bugs和errors。编程语言的前沿研究正在尝试各种方法,以数学方式证明程序将完全按照您的预期运行。此外,大多数编程语言设计的非数学性质意味着您可以使用的抽象受到语言中的工程决策的限制。如果您可以编写数学程序,那么您既可以证明代码的某些方面,又可以访问数学允许的几乎无限的抽象。这就是函数式编程的目标:以可用的方式将数学的力量带给程序员。
3、The value of functional programming in practice
#
这种编程的数学模型具有多种实际意义。由于所有函数都必须接受和返回值,并且必须始终为同一参数返回相同值这一简单规则,Haskell 是一种安全的编程语言。当程序始终按照您预期的方式运行,并且您可以轻松地推断其行为时,它们就是安全的。安全的编程语言是强制您的程序按预期运行的语言。 让我们看看哪些代码不安全,违反了我们简单的函数规则。假设你正在阅读一个新的代码库,并遇到了如下代码行。
tick()
if(timeToReset) {
reset()
}