本节书摘来自异步社区《Haskell函数式编程入门》一书中的第1章,第1.1节Haskell的由来,作者 张淞,更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章Haskell简介
Haskell函数式编程入门
本章首先介绍Haskell相关的历史,从Lisp诞生到多种函数式编程语言百花齐放,再到Haskell诞生的过程和现在发展的概况;接下来讲解安装Haskell编译器和编写Haskell程序所需要的软件,以及调试与测试函数的工具GHCi;然后介绍Haskell中定义的两种源代码文件(一个是以lhs为扩展名,另外一个是以hs为扩展名)有着怎样的不同;最后编写一个Helloworld程序当做学习Haskell旅程的第一步。
1.1 Haskell的由来
要讲述Haskell的由来还要从函数式编程的诞生说起。函数式编程有着非常悠久的历史,比C语言还要久远。20世纪30年代,美国数学家Alonzo Church引入了λ演算(Lambda Calculus),这是一个通过使用符号表达变量的绑定和替换来定义函数计算的系统,它是函数式编程语言的重要基石。也就是说,早在电子计算机还没有诞生的20世纪30年代,函数式编程语言就已经在孕育之中了。
1958年,斯坦福大学的教授John McCarthy受卡内基梅隆大学开发的一个名为IPL(Information Processing Language)语言的影响,开发了一个名为Lisp的函数式编程语言。虽然IPL并不是严格意义上的函数式编程语言,但是它已经有了一些基本思想,如列表内包、高阶函数等,本书会在后面的章节中依次做介绍。这些特性深深地影响了Lisp的设计。在Lisp诞生之后,越来越多的人开始加入到函数式编程的阵营中来。同时,Lisp的诞生也影响了很多编程语言的设计,时至今日,仍然有相当一部分人在使用Lisp。
在20世纪60年代,牛津大学的Peter Landin和Christopher Strachey明确了λ演算对函数式编程具有极高的重要性,并于1966年开发出了一个名为ISWIM(If you See What I Mean)的函数式编程语言,这是一个基于λ演算的纯函数式编程语言,一定程度上奠定了函数式编程语言设计的基础。
函数式编程发展到20世纪70年代早期的时候,爱丁堡大学的Rod Burstall和John Darlington使用函数式编程语言通过模式匹配来进行程序变换,并且明确地引入了列表内包的语法来更好地生成列表。几乎在同一时期,David Tuner教授在英国圣安德鲁斯大学,又开发了一个名为SASL(St Andrews Static Language)的纯函数式编程语言,一定基础上奠定了圣安德鲁斯大学在函数式编程领域研究的地位。
1975年,麻省理工学院的Gerry Sussman与Guy Steele开发了Scheme,这是一个更接近λ演算的语言,广泛应用于实践编程与教学中。如今,Scheme仍然被很多高校作为首要的课程来讲解。
不久,美国计算机科学家John Backus致力于函数式编程的研究,开发了一种名为FP的函数式编程语言。他引入了BNF符号系统以及对语言编译器系统的开发做出了突出的贡献,于1977年获得了图灵奖—他著名的图灵奖报告《编程是否能从冯诺依曼的体系风格中解放出来》(Can Programming be Liberated from the von Neumann Style ?)1中提到的“解放”的方式,实际上指的就是函数式编程。
也几乎是在同一时期,剑桥大学的Robin Milner开发了ML(Meta-Language),并发展出了多态类型系统——HM-System(Hindley-Milner type system),其中包括类型推断以及类型安全与异常处理机制。这个语言中的多态类型系统对函数式编程的发展意义重大,值得一说的是,Haskell使用的正是这种类型系统。
Scheme与ML都具有一定的顺序式语言的特性,但是这些语言改善了函数式编程的风格并且明确地引入了高阶函数的概念。20世纪70年代末与80年代初,惰性求值这一概念被重新被发展。SASL在1976年加入了惰性求值的功能,也出现了Lazy ML,即ML的惰性版本。在程序的运行过程中,惰性求值可使计算机仅仅计算需要的数据。
在近几十年的时间里,各个大学的学者们通过对函数式编程的研究,涌现出了很多基于函数式编程的理论。当然,与此同时还出现了很多不同的函数式编程语言。1987年,在美国俄勒冈州举行的函数式编程与计算机结构的会议(Functional Programming and Computer Architecture Conference,FPCA)上,与会者们就当时函数式编程语言种类过多、语法相似且大多数效率不高的现状进行了讨论。他们认为,这样下去的结果将会是越来越多的人研究和使用函数式编程语言,但是人们所使用的语言却得不到很好的统一。这种情形不利于函数式编程的研究、应用与发展。于是会议决定设计一个开源、免费、语法简单、运行稳定、效率高,可适用于函数式编程教学、研究,并且可编写应用软件的纯函数式编程语言来缓解函数式编程语言过多的混乱的局面,它的名字就是Haskell。它的命名源于美国数学家Haskell Brooks Curry,为纪念他在λ演算与组合逻辑(combinatory logic)方面作出的突出贡献。Haskell Curry使得函数式编程语言的设计在理论上有了非常坚实的基础。由此可见,Haskell是函数式编程发展了近60年的结晶,汇集了其他函数式编程语言的精华于一身,经过了20余年的发展,如今还在不断地壮大。
Haskell仅仅意为一门计算机编程语言,语言标准的1.0版本于1990年发布,语法的主要设计者之一是现任职于微软剑桥研究院的Simon Peyton Jones2教授。Haskell这门语言的编译器有很多种,其中GHC(Glasgow Haskell Compiler)是最常用的Haskell语言的编译器,名为哥拉斯哥是因为该编译器最初是基于Kevin Hammond教授在英国哥拉斯哥大学于1989年用Lazy ML所编写的原型。一年后,在Simon Peyton Jones的带领下,这个原型除分析器(parser)的部分全部被重写。第一个GHC的测试版于1991年4月1日发布,同时GHC也被作为了英国学术研究项目之一并且开始接受英国政府的资金支持。除GHC外,Haskell还有很多其他的编译器,比如由荷兰乌特勒克大学编写的UHC(Utrecht Haskell Compiler),由John Meacham所编写的JHC等。随着发展,Haskell语言的标准也开始发生变化,越来越多的特性与功能被逐渐加进来,两个里程碑的版本分别是Haskell 98和Haskell 2010。本书的大部分代码是符合Haskell 98标准的,但有一部分用到了Haskell 2010中增加的内容。读者可以参阅Haskell 98 report3和Haskell 2010 Report4来了解Haskell语法标准。