函数式编程会议、语言与书籍
Scala的创建者马丁·奥德斯基(Martin Odersky)指出:
Functional programming has become more and more popular in recent years because it promotes code that’s safe, concise, and elegant. Furthermore, functional programming makes it easier to write parallel code for today’s and tomorrow’s multiprocessors by replacing mutable variables and loops with powerful ways to define and compose functions.
函数式编程思维
1 直观的角度来说,函数式风格的代码可以写得很精简,大大减少了代码的行数,并且思维方式不再是命令式,而是偏向于自然语言.
2 其次,函数式的代码是“对映射的描述”,函数一词的意思不再是我们程序中的函数,方法,而是数学中的函数映射.
函数式编程特性
1 数据不可变性(immutable data)多有的变量只可以赋值一次,变量不可变,如果想改变变量就创建一个新的变量。
2 函数是第一公民(first class method)函数可以像普通变量一样去使用。函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。
3 引用透明(referential transparency) 指的是函数的运行不依赖于外部变量或“状态”,只依赖于输入的参数,任何时候只要参数相同,调用函数所得到的返回值总是相同的。天然适应并发编程,因为调用函数的结果具有一致性,所以根本不需要加锁,也就不存在死锁的问题。
4 尾递归化(tail call optimization)因为函数调用要压栈保存现场,递归层次过深的话,压栈过多会产生性能问题。所以引入尾递归优化,每次递归时都会重用栈,提升性能。
函数式编程技术(方法论)
1 映射化简(map & reduce)函数式编程最常见的技术就是对一个集合做Map和Reduce操作。这比起过程式的语言来说,在代码上要更容易阅读。传统过程式的语言需要使用for/while循环,然后在各种变量中把数据倒过来倒过去的
2 管道 (pipeline)把一组函数放到一个数组或是列表中,然后把数据传给这个列表,数据就像一个pipeline一样顺序地被各个函数所操作,最终得到我们想要的结果。他的设哲学就是让每个功能就做一件事,并把这件事做到极致,软件或程序的拼装会变得更为简单和直观。
3 递归 (recursing)递归最大的好处就简化代码,他可以把一个复杂的问题用很简单的代码描述出来。递归的精髓是描述问题,而这正是函数式编程的精髓。
4 柯里化 (currying)把一个函数的多个参数分解成多个函数, 然后把函数多层封装起来,每层函数都返回一个函数去接收下一个参数。
5 高阶函数(higher order function)函数当参数,把传入的函数做一个封装,然后返回这个封装函数。现象上就是函数传进传出。
相关会议
[1] TFP
在1988-1998期间召开了Glasgow Functional Programming Workshops(英国格拉斯哥函数式编程工作组),后来在1999-2001扩大为Scottish Functional Programming Workshops(苏格兰函数式编程工作组), 在2003年之后变为Symposium on Trends in Functional Programming(函数式编程趋势国际研讨会),简称为TFP,每年在全球不同国家的城市举办,已经在德国、爱沙尼亚、美国、荷兰、斯洛伐克、西班牙、法国、瑞典、加拿大、波兰等国家举办。
http://www.trendsfp.com/tifp/
[2] 中国函数式编程小会
相关语言
tfp网站中给出了一些常见的函数式编程语言
Caml
Clean
Erlang
Haskell
Hume
Scheme
Racket
Standard ML
现在各种语言都开始支持函数式编程:Agda、Clojure、C++、C#、Clean、Dummies、Elixir、Elm、Erlang、F#、Go、Haskell、Java、Javascript、Lisp、Python、PHP、Ruby、Scala、Swift等。
相关书籍
[1] Object-Oriented vs. Functional Programming Bridging the Divide Between Opposing paradigms, Richard Warburton, O'Reilly, 2015, https://www.oreilly.com/library/view/object-oriented-vs-functional/9781492048138/
在CSDN上由XIao_MinK翻译了其中的一些章节:
[1] Object-Oriented vs. Functional Programming第一章,https://blog.csdn.net/XIao_MinK/article/details/88879291
[2] Object-Oriented vs. Functional Programming第二章, https://blog.csdn.net/XIao_MinK/article/details/89165066
[3] Object-Oriented vs. Functional Programming第三章, https://blog.csdn.net/XIao_MinK/article/details/89927901
[4] Object-Oriented vs. Functional Programming第四章, https://blog.csdn.net/XIao_MinK/article/details/90647992
[2] 函数式编程思维 Functional Thinking, Neal Ford, 图灵程序设计丛书, 人民邮电出版社, 2015-08-01出版。
[3] Functional programming with PHP, Second Edition, Simon Holywell, 2016.