函数式编程之clojure.pdf

函数式编程之clojure.pdf

ID:34663909

大小:966.04 KB

页数:13页

时间:2019-03-08

函数式编程之clojure.pdf_第1页
函数式编程之clojure.pdf_第2页
函数式编程之clojure.pdf_第3页
函数式编程之clojure.pdf_第4页
函数式编程之clojure.pdf_第5页
资源描述:

《函数式编程之clojure.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、作者:@特价萝卜文档创建日期:2012-08-17本文改编自我在公司内部分享的《Clojure简介与应用》的讲稿。1.OOP的本质?面向对象编程(OOP)中最终要的是什么?抽象、封装、集成、多态?实现模式?设计模式?还有更重要的么?下面引用两段业内名言:“如果我们现在回头看一下面向对象这个思想是从哪来的,如果以基于消息传递机制的Smalltalk-80的特性来衡量现在的状态继承和面向对象的使用方式,我们不禁要问,我们是不是已经走错路了?”——2010伦敦QCon大会采访只关注状态,在类和基于映像的语言里缺乏良好的并发模型和消息机制。——DaveThom

2、as博士到底什么被忽视了?从这两段话中我们可以看出:是OOP的并发模型和消息机制被现代OO编程语言忽视了,尤其是Java。在当代OO语言中,可变状态让并发编程变得非常复杂,只能依靠悲观锁来进行并发的控制。至于消息传递机制,大都OO语言本身并没有提供有效的机制,而是运用设计模式来达到目的的,但这又会使编程的过程复杂化,也会在一定程度上影响代码的可读性。至今,业界已经承认OOP并不是万能的。而OOP的真正优势在于对现实世界的建模,而不是数据处理。我们应该辩证的看待不同范式的编程语言,死磕一个必然会使思想禁锢,甚至编程灵感尽失。2.FP是什么?现在我们来看看

3、在函数式编程(FP)中是怎样解决这些问题的。2.1函数式编程概览一种编程范式程序运算即为数学上的函数计算以λ演算(lambdacalculus)为基础函数为first-class,可以很方便的运用闭包创造出高阶函数避免状态、变量和副作用支持懒惰计算(lazyevaluation)和引用透明性1/13作者:@特价萝卜文档创建日期:2012-08-172.2函数式编程详解2.2.1不可变数据;;Immutabledata(defa'(123))(defb(cons0a));;b->'(123)(println"The'a'is"a);;b->0

4、appenda(println"The'b'is"b)运行结果:The'a'is(123)The'b'is(0123)引用a和b在定义时被赋值,并且在之后的任何时刻都不可能被改变。并且,在底层,a和b的值会重用一部分数据存储的。如下图:从图中可以看出,a和b引用的其实是同一个序列,只是起点不同而已。Clojure使用的这种技术叫做PDS(PersistentDataStructures)。Clojure的数据结构是不可变的,也是持久的。持久数据结构的好处包括:1)可以大幅提高程序效率。2)为并发编程提供有力支持。3)更容易进行数据版本控制。另外,与不可

5、变数据相关的另一个函数式编程概念是——引用透明。引用透明意味着相同的输入一定会返回相同的输出,即:一个函数的计算过程不会因任何外部环境的改变而发生变化。相信我们真正理解不可变数据之后,引用透明这个概念也会非常好理解的。2/13作者:@特价萝卜文档创建日期:2012-08-172.2.2一级类型——函数“把函数作为语言的一级类型”的意思是说,语言本身支持把一个函数作为另一个函数的输入和输出。首先,我们来看一个把函数作为另一个函数的输入的例子:;;thefunctionasa'first-class'1(defnmy-func1"Ademooffirst-

6、class"[df](fd))(my-func1"It'sfirst-class!"println)运行结果:It'sfirst-class!上面的代码做了这些事:1.定义了一个名字叫“my-func1”的函数。2.为这个函数写了一段内容为“Ademooffirst-class”的注释。3.声明了这个函数的两个形参:d和f。4.调用f,而d作为参数传给f。因此形参f必须代表一个需要传入一个参数的函数,这样才能被正确调用。5.我们调用了函数“my-func1”,并将内容为“It’sfirst-class”的字符串绑定到了形参d上、将println这个函数

7、绑定到了形参f上。6.根据“my-func1”函数中的定义,它本质上执行了这段代码:(println"It'sfirst-class!");;还记得“my-func1”函数体中的(fd)么?初读Clojure的代码需要注意几点:1.Clojure是基于JVM的Lisp方言,所以会有很多的括号(但是与Lisp相比已经简化了很多),这一点需要习惯。2.读Lisp家族的代码需要从最里面的括号开始读,一直读到最外面的括号。这是一种嵌套结构。3.Clojure中的一对括号(即,“(”和“)”)叫一个form,每一个from中可以有一个或多个元素。并且,form中

8、的第一个元素应该是一个函数的标识名(Symbol),后面的元素应该是传给这个函数的参数。所有的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。