若从学院派的角度来讲,此书对于讲解函数式,或可称为异端,因为它没有冗长晦涩的理论讲解与分析;若从学习Scala的角度来看,或可视作另类,因为它通篇没有介绍Scala的语法。这是否意味着她两边都不讨好呢?——非也!这实际得看读者的水平和期望。
我不愿意盲目推荐,免得误人子弟。要阅读此书,必得具备以下两个条件。其一是具备一定的Scala知识,尤其是高阶函数,模式匹配以及尾递归的知识。其二是对函数式编程满怀着渴望,并且不拒绝大量的编码练习。
阅读之前,先扪心自问。若不具备这两个条件,奉劝读者诸君远离此书,免得浪费你的时间。
好了,通过这一关,我得努力给您推销此书的好了。
我其实深深折服于本书第一章向我们打开的函数式世界。原来,代码可以这样写。好像口念咒语一般,神奇的魔法打开了异度空间,那里充满了绚烂、无穷以及未知。其实,这个空间无处不在,只是我们沉迷于面向对象的世界,成为了哥白尼之前的世人,以为面向对象就是程序员的全部世界。
这一章的案例可以让我们极度快速的明白函数的真谛,以及函数式编程带来的益处。
虽然是实践类的书籍,但它与Martin Odersky的Programming in Scala不同,它或者通过正文或者通过Sidebar或者通过注释,时时刻刻向读者传达函数式世界的专有术语。例如书中提到的pure function、referential transparency(RT)、subsitution model、monads、strictness等概念。这使得对函数式编程并不了解的读者,可以通过阅读本身,扩充自己的知识库,进而成为交流的基础。显然,这比单纯了解某种语言的语法有用许多。
本书的一个特殊之处在于她选择了Scala库中的一些设计元素作为案例,并以纯函数的方式重新实现,例如实现了自己的List、Option、Either、Stream等。这种方式有些取巧,实则恰如其分的找到了一个切入点。因为读者熟悉Scala,故而对这些例子并不陌生,这就降低了学习的难度;同时,它又极其符合函数式编程的特征,且能够基于这些设计元素传达函数式思想;额外的奖励更是让读者更加深入地掌握了Scala的语法本质;真可谓一举三得啊!
然而,我不得不提醒读者。若要阅读此书,需得完成本书的练习方有收获。这些练习就是作者设置的拦路虎,它让我们的阅读变得举步维艰。坦白说,时至今日,我还在慢慢地阅读本书的第五章呢。真是“路漫漫其修远兮,吾将上下而求索”啊!但我能清晰地感觉到自己的变化。就在阅读完第三章Functional Data Structures后,我感觉自己对模式匹配、泛型、高阶函数有了更深入地理解,也能够非常自如地运用map、flatMap、filter等操作,对List也有了更深入的理解。
虽然阅读并不顺畅,但只要你能看到自己的一点点进步,我想一定会有热情推动着你继续阅读,即使需要排除艰险。读书未必快乐,然而耽于安逸亦未必赐予你幸福;至少我相信,知识的汲取总会给你回报,这份回报又岂止是快乐那么简单!
阅读建议I
要练习本书案例,没有必要使用专业的IDE。然而,Scala提供的交互式窗口又不太适合我们输入代码。当然,我们也可以使用诸如Sublime编写代码,再到交互式窗口中以:l命令加载代码文件。可这种交互并不方便。所以,建议大家下载由上海广谈信息技术有限公司开发的开源软件ScalaConsole,它非常适合用来尝试scala语言特性、标准库及第三方库的api使用方法。
阅读建议II
本书练习一定要做,虽然某些练习有些难。大家或许会想,即使做了,我该怎么知道解题是否正确,又或者是否有更好的方案?所幸,本书作者在其github上给出了全书所有练习的答案,你可以下载它们,作为参考。不过你得忍住诱惑,只有在通过了充分思考,确定解题有难度时,才能阅读答案,否则就弱化练习的好处了。