函数式编程学习之路(二)
为什么要学习函数式编程?
不啰嗦了,因为,所以,就学.实际上,现在主流编程里都有它,比如最基础的lamdba,C#有,Python有,JAVA最近也要引入这玩意,不学函数式编程,那么以后代码里的有lamdba的部分就搞不定,那么码农的身份地位可能要降级成码畜了.这是不可以接受的现实!!!
那么,什么是函数式编程?
这个问题...实际上,很难于回答,google下吧,
函数式编程(英语:Functional programming),又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
恩,有网络就是强啊,有百科给你解释的很清楚(真的很清楚吗?)
不看还好,起初以为是写大堆函数来编程呢,仔细看下概念,这差距就象国美和美国一样.
我们来尝试用已知的知识来理解下:
1.是一种编程范型,:这个好理解,一个编程范型,过程式和面向对象就是.那么看上去象是个大概念,不简单
2.将电脑运算视为数学上的函数计算,这个比较困难了,我们以前理解电脑运算是数学运算加逻辑运算的,对应的编程就是+-*/加逻辑比较,好理解,但数学上的函数运算,一听就头大,和数学函数挂钩了.看来里头有高深的数学知识,小心脏有压力.
3.并且避免状态以及可变数据:这个说法让人凌乱,我们的经验知道,编程就是和状态,变量打交道的,避免状态以及可变数据,这是要逆天么?
4.函数编程语言最重要的基础是 λ 演算(lambda calculus):彻底晕倒,神码叫TMD λ 演算?好在lambda用过一点,x => x.id == 1, 这样的代码写过,但内涵不太懂.好处是不明白怎么回事,但竟然还会用!
5.λ演算的函数可以接受函数当作输入(引数)和输出(传出值):还好还好,这个本人明白,就是函数可以当函数的参数,函数返回值也可以是函数.套用本人一直说的,函数也可以当变量就好了,难道那就是函数式编程么?
再往下看:
函数式编程和其它范型相比,更强调函数的计算
也就是说函数及函数计算在函数式编程里,是相当原子及主要的操作.就象命令过程式里,语句是相当原子的操作,就象面向对象里,类定义及对象创建是相当原子的操作.
函数式编程经常使用递归
传统编程里递归有用,一般用在处理树型结构及层次型数据,象HTML及XML, JSON这些层次结构式数据,传统处理很麻烦得用各种库,函数式能轻松搞定?
纯函数式的程序没有变量和副作用。因为纯函数式程序设计语言没有变量,函数没有副作用,编写出的程序可以利用记忆化、公共子表达式消除和并发计算在运行时和编译时得到大量优化。
倒这里,感觉无变量无副作用,和面向对象有很大差别了.面向对象的属性很多时候就是变量,方法的副作用可大了.看来要写出纯函数不容易.
在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。
函数的副作用相关的几个概念, 纯函数(Pure Function)、非纯函数(Impure Function)、引用透明(Referential Transparent)。
范例(Java)
f(x) { return x + 1 }
f(x)函数就是纯函数。
a = 0 q(x) { b = a }
q(x) 访问了函数外部的变量。q(x)是非纯函数。
p(x){ print “hello” }
p(x)通过I/O API输出了一个字符串。p(x)是非纯函数。
c(x) { data = readConfig() // 读取配置文件 }
c(x)通过I/O API读取了配置文件。c(x)是非纯函数。
纯函数内部有隐式(Implicit)的数据流,这种情况叫做副作用(Side Effect)。我们可以把副作用想象为潜规则。上述的I/O,外部变量等,都可以归为副作用。因此,纯函数的定义也可以写为,没有副作用的函数,叫做纯函数。
可以看出,函数要纯,还不能有潜规则,真希望以后GWY考增加函数式编程!
特殊的函数副作用
process(context) { a = context.getInfo() result = calculate( a ) context.setResult( result ) }
这个...看到有副作用的函数,总会让人想起某些人某些事,看来,技术都是相通的.
纯函数的好处主要有几点: