快速业务通道

冒号课堂§4.1:函数范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
点怪异。”

“它是一个函数,也是filter的第一个参数,用来判断第二个参数rest的元素是否合格,即 < pivot。这体现了函数式的一个重要特征:函数是头等公民(first-class citizen)[4]——可作为传递参数、可作为表达式的值、可嵌入数据结构、也可与某变量绑定,与普通的基本数据类型毫无二致。这是函数式编程简洁而强大的重要根源。”冒号细加解释,“大家还记得上节课谈到的回调函数吧?callback无非是将函数作为参数来传递,本质上是将代码当数据来使用,回调机制的巨大威力均拜此高级用法所赐。”

众人又一段筋脉被打通了。

引号提出一个很实际的问题:“函数式编程的确很酷,可Java并不支持。如果采用Haskell之类的函数式语言,会不会带来系统集成上的困难?”

冒号打消了他的疑虑:“Java平台下已经集成了不少的支持函数式编程的语言,如JRuby、Jython、Groovy、Scala等,甚至Haskell在JVM下也有相应的Jaskell。其中Groovy与Java的结合最为自然,我们看一下它是如何实现quicksort的——”

/** 快速排序法的Groovy实现 */ def qsort(list) { if (list.size() <= 1) return list def pivot = list[0] return (qsort(list.findAll{x -> x < pivot})     +      list.findAll{x -> x == pivot}     +  qsort(list.findAll{x -> x > pivot})) }

“虽然比Haskell的代码略长了些,并且还带着过程式的烙印,但总体思想还是函数式的。”冒号紧扣本质,“函数式还有一个重要特征:无副作用或尽量减少副作用[5]。所谓无副作用,是指一个函数在被调用前后保持程序的状态不变。无副作用的函数不会改变非局部变量的值,不会改变传入的参数,也没有I/O操作。”

逗号脱口而出:“什么状态都不变,那这样的函数有什么用?”

冒号不以为奇:“你的这种想法源自根深蒂固的命令式思维。我们曾把命令式程序比作状态自动机,其运行过程就是在不断地修改机器的状态。而函数式程序则是进行表达式变换,一般不会改变变量的值。其实函数式并非完全不改变内存,只不过改变的是栈内存(stack)罢了。换言之,无副作用函数的作用关键在于其估值结果,按过程式的说法是返回值。”

冒号课堂§4.1:函数范式(5)

时间:2011-06-25 BlogJava xyz98

逗号如梦初醒。

问号仍有疑问:“药物最好没有副作用,函数没有副作用的好处是什么?”

冒号嘴一咧:“好处太多了。首先,没有副作用的函数易于重构、调试和单元测试。其次,代码有效性与函数顺序无关,方便并发处理和优化处理。举个简单的例子,计算两个函数的乘积:f(x) * g(y)。由于无副作用,f(x) 和g(y)的估值过程是独立的,估值顺序也不重要,因此理论上可以对二者并行计算。另外,还可利用惰性计算(lazy evaluation):如果算出f(x)为零,那么不用计算g(y)便可知乘积为零了。”

叹号忍不住赞叹:“听起来真不错!”

冒号言犹未尽:“最后,没有副作用的函数是引用透明的(referential transparency),即一个表达式随时可以用它的值来替换[6],正如数学中的函数一样,保证了数学思维的贯彻和运用。”

引号自感获益颇丰:“前面介绍范式时,觉得函数式最为神秘。现在总算有了些感性认识了。”

冒号道出缘由:“函数式编程不仅有许多独特的概念和方法,还有很深的数学背景——λ-演算(λ-Calculus)。如果一开始便倾囊相授,你们必会望而却步,我岂不是打草惊蛇了?”

众人始觉:老冒原来是在诱敌深入啊。

“尽管函数式有这么多优点,运算能力从

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号