函数式编程的思想发源要早于第一台计算机,其历史可追溯到上世纪三十年代,当时 Alonzo Church 和 Stephen C. Kleene 引入一种理论,叫 lambda 演算,属于数学基础研究。虽然它未能实现其初衷,但仍有一些逻辑分支在使用,并发展出有用计算理论。为了学习函数式编程的基本原理,有必须简单了解一下lambda 演算(下一章)。发明计算机以后,Lambda 演算放弃了它原来的领域,成为早期函数式编程语言的灵感。
1.2.1 函数语言
到 2008 年,第一个函数式编程语言走过了 50 年的历史。LISP,由约翰麦卡锡(John McCarthy)于 1958 年创建,直接基于 lambda 演算理论。LISP,一种极其灵活的语言,提出了许多今天仍在使用的编程思想,包括数据结构、垃圾收集和动态类型。
上世纪七十年代,罗宾米尔纳(Robin Milner)开发了一种语言,ML,它是包括现在F# 语言系列中的第一个。受类型化 lambda 演算的启发,ML 添加了类型的概念,甚至能够像我们现在 .NET 中处理泛型的做法一样写泛函数;ML 还有强大的类型推断机制,这是 F# 能写出简洁程序的关键。OCaml 出现于 1996 年,是对 ML 语言的务实扩展,它也是最早把的面向对象和函数式方法结合起来的语言之一。F# 深受OCaml 的启发,为了成为一流的 .NET 语言,且是真正的函数语言,必须将这些范式结合起来。
其他重要的函数语言还有 Haskell (一种纯正、优雅的数学语言)和 Erlang (因消息并发传递而著名,我们将在第十六章讨论)。我们学习Haskell 和 LISP,更多是有关优于F# 的主题,但首先看一下 F# 的历史。
1.2.2 .NET 平台上的函数式编程
第一个版本的 .NET 于 2002 年发布,和 F# 语言诞生于同一年。F# 最早是唐赛姆(Don Syme)和同事合作的一个微软研究项目,其目标是把函数式编程引入 .NET。F# 和类型化函数式编程通常会更加对 .NET 中泛型的需要分量,F# 的设计人员深入参与.NET 2.0 和 C# 2.0 中泛型的设计与实现。
由于在核心框架中实现了泛型,F# 进展更快,在F# 中使用的编程风格也开始改变。它开始是作为支持对象的函数语言,但作为成熟的语言,取两种风格中的长处似乎更自然。因此,F# 现在更精确地说是一种多范式(multiparadigm)语言,结合了函数式和面向对象的方法,还有一套工具,能够编写交互方式脚本。
[MICROSOFT F#]
F# 是针对 .NET 框架的函数式编程语言,它将函数式编程的简洁性、表现性和组合性风格与.NET 的运行库、库、互操作性、对象模型结合在一起。[F# 主页]
F# 自诞生之初就一直是 .NET 的一等公民,它不仅能够访问所有标准的 .NET 组件,而且,同样重要的是,所有其他 .NET 语言也能够访问用 F# 开发的代码,这样,既可以用 F# 开发独立 .NET 应用程序,也可以开发大型项目的一部分。F# 一直受Visual Studio 支持,在 2007 年,F# 开始从研究项目转变为完全产品级的语言;2008 年,微软宣布 F# 将成为随 Visual Studio 2010 发布的语言之一。就这一点而言,也应该成为关注 F# 和整个函数范式很好的理由,但现在让我们看看更务实的原因。
1.2 通往实用函数编程之路