函数式编程scala前言
2016-01-22
v2
Scala函数式编程是一个吸引人的标题。毕竟,Scala通常被称为一个函数式编程语言,并且市面上已经有许多关于Scala的书籍。这些书难道都缺少语言的函数式方面的介绍吗?要回答这个问题,就需要我们进行更深入地挖掘。什么是函数式编程?对于我来说,它只是一个“用函数来编程”的别名,即一种程序设计风格,它关注程序中的函数。什么是函数呢?在这里,我们能找到一个更大范围上的定义。虽然一种定义经常承认函数有可能在返回结果时会带来副作用,而纯函数式编程会把函数限制为数学层面的函数:参数与结果之间的映射这种二元关系。
Scala是一种不纯的函数式编程语言,因为它不但承认纯函数也承认不纯的函数,并且它并不试图用不同的语法或给他们以不同的类型来区分纯与不纯这两种类别。它与大多数其他函数式语言共享这一特性。当然如果我们能够在Scala中区分纯与不纯的函数会很好,但我认为我们还没有找到一种足够轻量和灵活的方法,能让我们毫不犹豫的把这种能力添加到Scala中。
可以肯定的是,Scala程序员通常鼓励使用纯函数。但出于互操作性、高效或便捷性的考虑,像变化、I/O相关、或是使用异常这些副作用却并没有都被排除,因为它们有时确实带来了不少的便利。但一些专家们通常认为过度使用副作用是不好的。然而,由于在Scala中可以写不纯的程序,写的很方便,那些来自于命令式背景的程序员会被此吸引,因为他们可以保持自己原有的风格,而不努力去适应函数式的观念。事实正是如此,你可以像写java不加分号一样写Scala代码。
所以,为了能好好学习Scala的函数式编程,我们只能从纯函数语言如Haskell来过度吗?所有赞成这种说法的观点都因为这本《Functional Programming in Scala》的出现被严重削弱!
Paul和Rúnar所做的,简单的说,就是把Scala作为一个纯粹的函数式程序语言。可变的变量、异常、经典的输入/输出、以及其他所有的不纯的痕迹都被去除。如果你想知道一个人不去使用上面提到的这些便利如何来编写有用的程序,那你需要好好读这本书。这本书从第一条原则建立开始,然后一路延伸到递增的输入和输出,他们证明,确实,我们可以只使用纯函数来表达每一个概念。他们还证明,它不仅仅可行,而且还能带来漂亮的代码和对计算本质的深入理解。
这本书很有挑战性,因为它即需要关注细节,而且它可能会挑战你对编程的思考方式。通过阅读这本书,完成推荐的练习,你会更好地理解什么是纯函数式编程,它能表达什么,它的好处是什么。
我特别喜欢这本书是因为它是自成一体的。它从最简单的表达方式开始,每一个抽象都解释到细节,而后续的抽象又是按顺序建立在之前的抽象之上。从某种意义上说,这本书建立一个不同与传统编程的Scala宇宙,其中可变状态是不存在的,所有的函数都是纯的。常用的Scala库往往有一点偏离这个理念;他们往往是基于(大多数情况下)函数式接口的一个部分命令式的实现。Scala允许可变状态封装在函数式接口中,在我看来,这也是其优势之一。但这种能力也经常被误用。如果你发现自己已经习惯于使用这种能力了,那么《Functional Programming in Scala》将会是一针强大的解毒剂。
MARTIN ODERSKY
CREATOR OF SCALA