首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Ruby,Scala跟JavaScript中的函数式编程(一)

2013-10-01 
Ruby,Scala和JavaScript中的函数式编程(一)函数式编程(英语:Functional programming)或者函数程序设计,又

Ruby,Scala和JavaScript中的函数式编程(一)
函数式编程(英语:Functional programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

从具体的编程语言实现来来看,数据的不变性,一等函数,高等函数,lambda运算,闭包,惰性求值。另外函数式编程大量使用递归,但是递归效率很低,因此出现了尾递归来优化。除了这些通用的特性以外各个编程语言还实现了自己独有的函数式编程特性。下面就先从通用的开始介绍,然后在介绍各个编程语言独有的特性。

数据的不变性:数据不变性指的是一个编程语言中的数据类型一旦分配空间并初始化,那么他的内容就不可以再改变。由于这儿讨论的是都是面向对象的编程对象,而面向对象的编程语言中可以有两种类型的”变“:引用改变和对象属性的改变。引用改变非常简单,Java的final和C++的const都可以实现。因此这儿代表的是对象属性的不可变,在函数式编程里面强调避免使用程序状态以及易变对象。因为这样就不用考虑对象共享的问题了,一个对象可以任意共享,因为知道这个对象会保持原样。

Scala中的不变:Scala中提供了var和val用来控制引用的不变性,var表示变量,val表示不变。注意他们就相当于Java中的final关键字,并没有保证底层对象的不可变。例如:

Array = [“ssj”,20,”ssh”,12]Array<<”ssjssh”Array.freeze =Array<<”sshssj”//RuntimeError:can’t modify frozen Array

另外:Erlang使用的也是引用的模型,它的引用和值都不可变。因此可以认为Erlang的变量完全不可变。
Ruby使用冻结的方法可以得到不变的值,但是没有办法来阻止引用不可变。
Scala的引用不可变非常容易实现,但是值不变需要类的封装来实现,这样它的机制比较难以实现,细节也较多。
相比较而言,Erlang不变量最简单最易用,Ruby的使用比较Scala来的简单。


热点排行