多种网盘链接检测插件 购买前,请先检测网盘链接是否有效
《Scala函数式编程》_1
《Scala函数式编程》_2
《Scala函数式编程》_3
内容简介:
Scala函数式编程
[美] Paul Chiusano Runar Bjarnason著
王宏江钟伦甫曹静静译
電子工掌出版社
ishing House of Electronics Industry
北京 BELING
内容简介
函数式编程越来越多地从学术界走向工业界,很多和人们ri常相关的重要系统背后都
有函数式编程的身影,并且比例越来越高。在这种大的趋势下,甚至很多指令式编程语言
也受其影响加入了对一些函数式特征的支持,比如ava8终于将 lambda加了进来
这本书对想要接触函数式编程,或在实际业务中已经使用函数式但想要系统巩固函数
式编程知识的程序员来说,是一本非常有价值的书。它以Scaa为载体,涵盖了函数式的基
础和高阶特性。尤其里面的一些高阶特性是在其他书籍中极少介绍到的。因而,非常值得
亟待解决高并发问题,或大数据领域从业的开发人员学习。
Original English Language edition published by Manning Publications, USA. Copyright
e 2015 by Manning Publications, Simplified Chinese-language edition copyright o 2016 by
Publishing House of Electronics Industry. All rights reserved.
本书简体中文版专有出版权由 Manning Publications授予电子工业出版社。未经许可
不得以任何方式复制或抄袭本书的任何部分。专有出版权受法律保护。
版权贸易合同登记号图字:01-20153996
图书在版编目(cP)数据
Scala函数式编程/(美)基乌萨诺( Chiusano,P.),(美)比亚尔纳松( Bjarnason,R.)
著;王宏江,钟伦甫,曹静静译.一北京:电子工业出版社,20164
书名原文: Functional Programming in Scala
SBN978-7-121-28330-7
.①s…Ⅱ.①基…②比…③王…④钟…⑤曹…Ⅲ.①JAVA语言-程序设计Ⅳ.①TP312
中guo版本图书馆CIP数据核字(2016)第053663号
责任编辑:张春雨
印刷:三河市双峰印刷装订有限公司
装订:三河市双峰印刷装订有限公司
出版发行:电子工业出版社
北京市海淀区万寿路173信箱邮编:100036
开本:787×9801/16印张:16.75字数:402千
版次:2016年4月第1版
印次:2016年4月第1次印刷
定价:69.00元
凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本
社发行部联系,联系及邮购电话 010)88254888
质量投诉请发邮件至zits@phei.com.cn,盗版侵权举报请发邮件至dbqg@ophei.com.cn
服务热线 010)88258888
推荐序1
我可能是全中guo程序员圈子里最不适合给《Scaa函数式编程》写序的人
年前我写过《 Scala七大死穴》,算是把Scaa批判了一番。前几天我则在准备
ghtWorks咨询师大会上的讨论话题《没有函数的函数式编程》,又要杯葛函数式编程
的样子
看起来,我无论对 Scala还是对函数式编程,都没什么好评嘛。宏江莫不是疯了,居然
要我来写序
等等,事情似乎不是这样。最近几年, Thought Works的客户在越来越多的项目中采用
了Saa技术栈, Thought Works也孵化出了若干基于 Scala的开源项目。我本人也在这些
项目中起到了一些作用。
为什么我会做这些“口赚体正直”的事呢?这得从十年前说起。
我最早是在C++中开始接触到函数式编程的概念。C+和 Scala一样,也是一门多范
式语言。C++的标准库和 Boost都提供了许多函数式编程的设施。但是,在我职业生涯初期,
给我留下深刻印象的函数式编程库要数 Boost Egg
利用 Boost Egg,你可以写出 my_list filtered( &is_not X) filtered( &is not Y)这样的代码
你会注意到这种用法和 Scala标准库非常相像,它大致相当于 Scala的 my List filter(isNotX)
filter( is NotY),这种 filter的用法,本书第5章中也有讲解。
Boost Egg的另一个特点是“非侵入”,比如上例的 filtered函数,本身并不是 my_list
的成员。相反,我们通过重载|运算符给原有的类型添加新功能。这种做法在Scaa里面相
当于隐式转换,本书第9章中提供的例子正是利用隐式转换,给字符串添加了中缀操作符。
虽然 Boost Egg没能流行起来,但对我个人而言很重要,因为它很大程度塑造了我对代
码的品位
有趣的是, Boost:Egg的作者 Shunsuke Ogame近年来的开源项目,都是些 Scala项目,
可能这也是因为C++和 Scala非常相似的缘故吧
另一个对我代码品位影响很大的技术是Lua中的协程( coroutine)。Lua的作者
oberto lerusalimschy把协程称为“单趟延续执行流”( One-shot continuation)。有了协程
推荐序1
或者延续执行流,程序员可以手动切换执行流,不再需要编写事件回调函数,而可以编写
直接命令式风格代码但不阻塞真正的线程。我的前东家网 易在开发游戏时,会大量使用协
程来处理业务逻辑,一个游戏程序内同一时刻会运行成千上万个协程。
而在其他不支持协程或者延续执行流的语言中,程序员需要非阻塞或异步编程时,就
必须采用层层嵌套回调函数的CPs( Continuation-Passing Style)风格。这种风格在逻辑复
时,会陷人“回调地狱”( .C.A.L.L.back Hell〕)的陷阱,使得代码很难读懂,维护起来很困难
scala语言本身并不支持协程或者延续执行流。因此,一般来说,程序员需要非阻塞或
异步编程时,就必须使用类似本书第13章“外部作用和IO”中介绍的技术,注册回调
数或者用 for/yield语句来执行异步操作。如果流程很复杂的话,即使是 for/yield语法仍
会陷入回调地狱。
我对Scaa开源社区的贡献之一是 stateless-future这个库提供了一些宏,实现了延续
执行流,可以自动把命令式风格的代码转换成CPs风格。通过这种做法,程序员不再需要
手写本书13.2节那样的代码了,编写的代码风格更像普通的aa或者PHP风格,直接像流
水账一样描述顺序流程
后来,我把这种避免回调函数的思路,推广到了其他用途上。比如,我开发了基于
Scala js的前端框架 Binding. scala。使用 Binding, scala的用户,编写普通的HTML模板,描
述视图中的变量绑定关系,而不需要编写高阶函数就能做出交互复杂的网 页
而我的另一个开源库Eah,则更进一步,支持一切 monad。大多数情况下,使用了
Each就不需要编写任何高阶函数,我称之为“没有函数的函数式编程”。这意味,本书第
11章到第15章的全部内容,你都可以直接编写类似Java的命令式语法,而Each则自动帮
你生成使用 monad的代码
总之,我是Scaa函数式编程的死对头,我写的 Scala库,恰恰是为了避免使用本书中
谆谆教导的各种高阶函数。如果你是个ava程序员,想在最短的时间内用 Scala开始“搬砖”
那么,从实用角度出发,我建议你合上本书,直接用Each即可。因为,虽然Each最终会
生成 Monad风格代码,但是,本书中涉及的使用高阶函数的细节,就像汇编语言一样,就
算你不知道也照样可以干活
不过,如果你是个求道者,追求编程艺术的真理,希望刨根到底,理解函数式编程的
内在理论和实现机制,那么本书很适合你
这本书绝不轻易放过每个知识点,全书包含有大量习题,要求你自己实现 Scala标准库
或者 Scalar中的既有功能。所以,当你读完本书,做完习题后,虽然你的应用开发能力并
不会直接提升,但你会体会到构建函数式语言和框架时的难点和取舍,从而增进你的框架
开发和语言设计的能力
Thought Works Lead Consultant杨博
参考资料
1. Boost Egg
2.关于Lua中的协程,参见A. L. de moura.,N. rodriguez,andR. lerusalimschy. Coroutines
in Lua. Journal of Universal Computer Science, 10(7): 910-925.
关于延续执行体的历史,参见 Reynolds, John C.(1993).\" The discoveries of
continuations(PDF). Lisp and Symbolic Computation 6(3/4): 233-248
4.关于 Scala异步编程的“回调地狱”问题,参见 Business-Friendly Functional
ogramming-Part 1: Asynchronous Operations
#############################################
|
|