函数式编程

函数式编程 函数式编程已经有比较长的历史了,如今的动态语言,很大程度上也受到了函数式编程(反过来名叫命令式编程)的启发。

在函数式编程语言中,当你写了一个函数,接受一些参数,那么当你调用这个函数时,影响函数调用的只可能是你传进去的参数,而你得到的也只能够是计算结果。因此,一个void的方法,是没有任何意义的。如果传入了引用类型的参数,也是不合要求的。

在函数式编程中访问状态是十分安全的,因为状态不会改变,我可以把一个Point或List对象交给任意多的地方去访问,完全不用担心副作用。函数式编程的十分容易并行,因为我在运行时不会修改状态,因此无论多少线程在运行时都可以观察到正确的状态。两个函数完全无关,因此它们是并行还是顺序地执行便没有什么区别了。我们还可以有延迟计算,可以进行Memorization,经常使用递归作为控制流,这些都是函数式编程中十分有趣的方面。

在函数编程中,编程人员有一个天然框架用来开发更小的、更简单的和更一般化的模块, 然后将它们组合在一起。函数编程的一些基本特点包括:

  • 支持闭包和高阶函数。
  • 支持懒惰计算(lazy evaluation)。
  • 使用递归作为控制流程的机制。
  • 加强了引用透明性。
  • 没有副作用。

在实际编程中,我们需要共享许多东西,比如显示器,比如打印机,比如某一块区域的资源,一旦这样的事情发生(这样的事情太频繁了,以至于函数式编程反而变得越来越稀缺),我们就需要额外地考虑很多因素。

老赵写了这么一个有趣的说明:

private int i = 0;  
public lambda int Function( int p, Random random )//编译错误,不允许引用类型参数  
{  
    int j = p + i;//编译错误,不允许使用i。  
    p++;//编译错误,不允许更改变量  
    int r = random.Next( j );//编译错误,不允许使用非lambda修饰的函数。  
    return r;  
}  

 

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

分享到:

2 comments

  1. 编程范型详解 说道:

    [...] 函数式编程是最近几年炒得火热的话题,我在《函数式编程》这篇文章中已经简要地介绍过了,它和一般的命令式编程最本质的区别在于“没有状态”(关于状态,请移步这篇文章),即像数学函数一样 ,输出值仅仅依赖于输入参数。正因为“没有状态”,这才有“必须有返回值”、“没有副作用”、“透明引用”和“惰性计算”等等特点。除了这一条最本质的以外,还要加上一条“函数是一等公民”,这就意味着函数本身可以像普通变量一样作为参数传递了。 [...]

  2. [...] 函数式编程是最近几年炒得火热的话题,我在《函数式编程》这篇文章中已经简要地介绍过了,它和一般的命令式编程最本质的区别在于“没有状态”(关于状态,请移步这篇文章),即像数学函数一样 ,输出值仅仅依赖于输入参数。正因为“没有状态”,这才有“必须有返回值”、“没有副作用”、“透明引用”和“惰性计算”等等特点。除了这一条最本质的以外,还要加上一条“函数是一等公民”,这就意味着函数本身可以像普通变量一样作为参数传递了。 [...]

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Preview on Feedage: