WEB开发网
开发学院网页设计JavaScript 什么是函数式编程 阅读

什么是函数式编程

 2010-09-14 13:13:57 来源:WEB开发网   
核心提示: 闭包(Closure)指携带着它们被定义所处的“环境”的函数,特别地说,什么是函数式编程(2),一个闭包可以引用在它定义时可用的那些变量,下面我们来泛化前面的函数,其第二个参数是一个函数(receiver_fn),它再重复调用receiver_fn,使得函数可以输入

闭包(Closure)指携带着它们被定义所处的“环境”的函数。特别地说,一个闭包可以引用在它定义时可用的那些变量。下面我们来泛化前面的函数,使得函数可以输入任何整数列表并将每个元素乘以一个任意值n:

let multiply n list =
 let f x =
  n * x
 in
 List.map f list
 ;;

因此:

# multiply 2 [1; 2; 3];;
- : int list = [2; 4; 6]
# multiply 5 [1; 2; 3];;
- : int list = [5; 10; 15]

multiply中需要注意的重点是嵌套函数f。这是一个闭包。看一下f是如何使用n的值的,它并未实际作为一个明确的传递给f,f而是直接从它的环境中获取了n的值——它是multiply函数的参数,因此在其中是可用的。

听起来可能很直观,不过让我们再仔细看一下对映射的调用:List.map f list。

map是定义在List模块中的,和当前的代码并不在一起。换句话说,我们将f传递到一个“很久很久以前,在一个遥远的星系中”定义的模块。就我们所知而言,代码可以将f传递到其他模块,或者将f的引用保存在某处等待以后调用。无论怎么做,闭包都会确保f一定可以访问其来源的环境,并获取n。

下面是从lablgtk中截取的实际的例子。它其实是一个类的方法(我们还没讨论过类和方法,现在只要将其认为是一个函数定义就行了)。

class html_skel obj = object (self)
 ...
 ...
 method save_to_channel chan =
  let receiver_fn content =
   output_string chan content;
   true
  in
  save obj receiver_fn

首先,你要知道在这个方法最后调用的save函数,其第二个参数是一个函数(receiver_fn)。它再重复调用receiver_fn,将来自部件的文本片断储存起来。

上一页  1 2 3 4 5 6 7  下一页

Tags:什么 函数 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接