函数式编程

数学实际上是一个谜语:我们设置了一系列基本的不冲突的原理和一些可以施加于这些原理的操作规则,然后我们就能堆砌这些规则以形成更复杂的规则。数学家把这种方法叫做“形式系统”或“演算”。

函数式编程的优点

单元测试
因为函数式编程的每一个符号都是 final 的,没有函数产生过副作用。因为从未在某个地方修改过值,也没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)。这意味着函数求值的结果只是其返回值,而惟一影响其返回值的就是函数的参数。
而命令式编程就不能这样乐观了,在 Java 或C++ 中只检查函数的返回值还不够——我们还必须验证这个函数可能修改了的外部状态。
调试
如果一个函数式程序不如你期望地运行,调试也是轻而易举。因为函数式程序的bug 不依赖于执行前与其无关的代码路径,你遇到的问题就总是可以再现。
并行
函数式程序无需任何修改即可并行执行。不用担心死锁和临界区,因为你从未用锁!
代码热部署
对函数式的程序,所有的状态即传递给函数的参数都被保存在了堆栈上,这使的热部署轻而易举!实际上,所有我们需要做的就是对工作中的代码和新版本的代码做一个差异比较,然后部署新代码。其他的工作将由一个语言工具自动完成!
机器辅助的推理和优化
函数式语言的一个有趣的属性就是他们可以用数学方式推理。因为一种函数式语
言只是一个形式系统的实现,所有在纸上完成的运算都可以应用于用这种语言书
写的程序。编译器可以用数学理论将转换一段代码转换为等价的但却更高效的代
码[7]。多年来关系数据库一直在进行着这类优化。没有理由不能把这一技术应用
到常规软件上。
模式匹配

让我们用一个例子深入了解一下模式匹配。这是一个Java的Fibonacci函数:
int fib(int n) {
if(n == 0) return 1;
if(n == 1) return 1;
return fib(n - 2) + fib(n - 1);
}
让我们从Java衍生出的语言来支持模式匹配:
int fib(0) {
return 1;
}
int fib(1) {
return 1;
}
int fib(int n) {
return fib(n - 2) + fib(n - 1);
}
两者有什么区别?编译器为我们实现了分支。这有什么大不了?的确没什么。有
人注意到很多函数包括了复杂的 swith 语句(尤其是在函数式程序中)所以认为
这种抽象形式很好。我们把一个函数定义分离成多个,然后把模式置于参数中
(有点象重载)。当这个函数被调用时,编译器使其比较参数和其运行时的定义
然后选择其中正确的一个。这一般是通过选择可选的最特定的定义来完成。例
如,int fib(int n) 可以以 n 等于 1 被调用,但是实际上 fib(n) 没有被调用,因为
fib(1) 更加特定。
模式匹配什么时候适用?情况太多了!每当你有一个嵌套着 if 的复杂的数据结
构,这时就可以用模式匹配以更少的代码完成得更好。一个很好的例子闪现在我
脑海,这就是所有 Win32 平台都提供了的标准的 WinProc 函数(即使它通常被抽
象了)。通常模式匹配系统能检测集合也可以应付简单的值。例如,当传给函数
一个数组后,就可以找出所有首元素为 1 第三个元素大于 3 的所有数组。
模式匹配还有一个好处即如果需要增加或修改条件,那么不必对付一个巨大的函
blog中文翻译 » 函数式编程另类指南http://chn.blogbeta.com/232.html
第14页 共20页2007/1/29 20:03
数。只需增加或修改适合的定义即可。这消除了“四人帮”(GoF)书中的一大类设
计模式。条件越复杂,模式匹配就越有用。一
Closures
如高阶函数,在非纯粹的函
数式语言里传递函数作为参数和限制在 lambda 演算系统中的作法有些不同,它
需要一种常被称为词法(lexical)closure 的有趣特性。下面我给出几个例子。记
住,这里变量不再是final的,函数可以引用其作用域外的变量:
Function makePowerFn(int power) {
int powerFn(int base) {
return pow(base, power);
}
return powerFn;
}
Function square = makePowerFn(2);
square(3); // returns 9
函数 make-power-fn 返回了一个函数,它有一个参数,并对这个参数进行一定阶
的幂运算。如果对 square(3) 求值会有什么结果?变量 power 不在 powerFn 的作
用域中,因为 makePowerFn 已经返回它的栈桢而不复存在。
运行环境必须存储两个power的拷贝,每个我们用 make-power-fn 生成的函数都用一个拷贝。保存这些值的现象就被称为 closure。 closure 不只保存宿主函数的参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值