函数式编程(functional programming)学习总结

梳理一下函数式编程中的各个概念,会不定期更新。大部分是转载别人的文章,加一些感想,所以也不能算作原创。

之所以会写这个是看到了分享的一个ppt:
https://docs.google.com/presentation/d/1SwrUqNVVsHxmwmnT7QYsnf3b7gDi9lTZRD-4-wPLA28/edit#slide=id.p,我以前也接触过FP,但很少实际写,用FP比如scala写出来的代码的确很简洁,但总有不如imperative programming language来得直接的感觉。

lambda演算与currying

下面这篇文章讲得很清楚:

http://www.cnblogs.com/fox23/archive/2009/10/22/intro-to-Lambda-calculus-and-currying.html

lambda演算定义了一些和函数相关的操作,包括把函数当做参数、把函数当做返回值。currying则是指把一个带有n个参数的函数转化成n个单参数的函数链,通过只给部分参数赋值,进而引出partial function的概念。在scala等语言里面是直接支持currying的,python有相应的库functools.partial来支持。

Monad

Monad这个东西不好翻译也不好解释。知乎上有一个很好的讨论:

https://www.zhihu.com/question/19635359

其中有一条建议是:初学者不要随便写monad tutorial。。。误人子弟。。于是我就不敢多说了,不准确的讲,monad就是将一系列的操作序列给封装起来了。

异步编程(Asynchronous Programming)

对于大部分从C/C++走过来的人来说,异步编程是一个不大好掌握的东西。因为我们总是习惯于上一条语句执行完了再开始执行下一条,但是aynchronous就常常以为这上条语句的结果还没出来,下条语句就开始执行了。

异步编程常常和event based programming沾上边,比如网页中client和server的交互,发出http请求之后,不可能一直阻塞在那里等待响应返回或者超时事件发生,那样执行效率太低。

我接触的和异步编程的编程语言主要是node.js和scala,推荐两篇文章:

1.介绍scala中的future、promise等异步特性:

https://windor.gitbooks.io/beginners-guide-to-scala/content/chp8-welcome-to-the-future.html

2.介绍node.js中的异步相关:

http://www.infoq.com/cn/news/2011/09/nodejs-async-code

3.scala当中的actor,可以把actor理解成更细粒度的thread。

http://www.caimi.la/2014/06/05/scalaxue-xi-bi-ji-4-actorbian-cheng.html

要想深入了解,可以自己多去搜索资料。

java 8中添加的FP特色

lambda表达式、Function接口

java常被诟病的一点就是写出来的代码一大坨。。但其实就干了那么一点事情。。lambda表达式的引入可以大大简化java代码,比如sort函数,不需要自己写一个Comparator接口,直接传入一个lambda表达式就行了。

介绍:http://www.infoq.com/cn/articles/Java-se-8-lambda

方法引用(Method Reference)

在需要传递一个函数作为参数的地方,除了可以传入一个lambda表达式之外,也可以传递一个现成的方法。

参见http://blog.csdn.net/wwwsssaaaddd/article/details/37573517

流(stream)

流就是一个无穷长的序列,infinite sequence,当然了,内存有限的计算机无论如何都不可能存储得下无穷长度的序列。因此stream常常和lazy evaluation(惰性求值)关联在一起,只有在实际需要求值的时候才会把流中的值求出来。

一篇很好的介绍:http://blog.csdn.net/chszs/article/details/47038607

基于stream的操作往往强大而且简洁,常见的有map, filter, reduce,在python里面这些都是内置的函数,在其他编程语言中一般也有实现。

Optional类

java里面很烦人的一个异常就是NullPointerException,新引入的Optional类就是为了减少程序设计者处理NullPointerException的麻烦。Optional,顾名思义,就是这个类里面可能有数据,也可能没有。

一篇文章介绍:
http://examples.javacodegeeks.com/core-java/util/optional/java-8-optional-example/

在C++的boost库里面,也有一个类似的boost::optional:

http://www.boost.org/doc/libs/1_43_0/libs/optional/doc/html/boost_optional/examples.html

并行数组(Parallel Array)

在现代的处理器上,一般都是multiple core的,但是以前库函数里面的sort等算法都是串行的实现,为了充分开发并行性,java 8引入了parallel array.

http://itindex.net/detail/49339-java-%E5%B9%B6%E8%A1%8C-%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90

在数据量小的时候,并发去做一般得不偿失,但数据量很大的情况下往往可以获得几倍的加速。

总结

FP是个很神奇的东西,还需要不断学习和实践。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值