十分奇怪的一本书
我根本不知道怎么来评价这本书,因为这本书我拖了很久很久才看完,原因也不是因为我拖,想来想去是这本书怪。
总结起来可能是——我懂的地方书里提到了,能看懂;我不那么懂的地方书里提到了,我依然看不懂。
书的第一章是很精彩的,一步步带领读者将命令式改写成函数式:用上流畅接口、加上 map reduce filter、把一个循环里的几件事拆成几个 stream,每个 stream 里做一件事。看第一章的时候,我对这本书的期待值变得很高:如此绝妙,一定是天人之姿。
呵呵。第二章开始罗列 Scala、Groovy 和 Clojure 里的 map reduce filter 是怎么使用的,我对这仨基于 JVM 的语言毫无兴趣,根本不想看啊。忍着,忍到最后,发现整本书都是用这三个语言,通过代码的实现来论证作者自己提出的“函数式拥有的特性“。这仨语言的实现,抱歉看不下去。忍着读了,只觉得痛苦。
再到后来,提到了 lazy evaluation,我一直很好奇的一个特性,但是作者写的我根本没看懂。还提到了 “第三章 Scala 的模式匹配“,第三章压根没有啊,翻来覆去地看,我还以为自己眼睛瞎了,后来发现模式匹配还在这一节的后面——不知道这是作者还是译者、编辑、校对、印刷的锅?
模式匹配讲得很一般,我没看出来这里面将模式匹配与 switch 的对比,对比出来的结论里模式匹配和 switch 有啥区别。远不如我以前学 UW 的那个 PL 第一门教 SML 时模式匹配的说道。不过这一章的例子让我突然明白,树的精髓在于模式匹配和递归,这俩都是反命令式编程直觉的,所以对于命令式惯了的思维来说很难主动想到。
在第六章提到了设计模式被函数式编程替代的方面,论证得还算不错,不过提到的设计模式实在冷门,反正我没有学过(不常见)。而且这一章给谁看呢?喜欢函数式的人,都不会喜欢设计模式的。
第七章写 Java 8 的函数式改造,说实话,这一章还可以,至少我看得懂。没了。
第八章,我不懂 mixin,不想看三大语言,看不懂。只看懂了上下文抽象和复合型抽象对区别——这用你说?
总之,这本书没有提到 monad,对柯里化、缓求值、模式匹配都讲得很糙。几乎没有目标受众的一本书,不属于入门级也不属于深入级。但是鉴于第一章写得很好,给个三星还是可以的。