Chapter3 - 匿名函数 - Anonymous Functions

 

F#提供了另外一个给我们去定义函数的方式,这就是使用关键字 fun

在接下来我们会给出例子。一般来说,在有些没有必要去定义一个局部使用,或者是不需要

名字的函数的时候你会用到这个特性。

比如当你的函数可能是会以参数的形式传递给另外一个函数,又或者该函数的作用小到不足以

费周折去定义它的时候。事实上,比如在使用List的时候我们就经常会用到它。

而事实上匿名函数也被称为lambda表达式(译者:我不知道这个说法正确不哈,但作者是这么说的。)

 

下面看代码:

 


let x = (fun x y -> x + y) 1 2

//便是使用了一个匿名函数,并且立刻执行了他

//他相当于

let f x y = x + y

let x = f 1 2


结果为 : 3

 

同样,你也可以使用关键字function来定义一个函数,这跟使用fun的不同之处在于,

在使用function的时候,你可以使用模式匹配。(稍后章节会介绍)

下面我们来看稍微复杂一点的:

 


let x1 = (function x -> function y -> x + y ) 1 2

let x2 = (function (x,y) -> x + y) (1,2)


 

上面的两种结果是一样的。

(译者:不过第一种方式的使用涉及到了另外一个概念,函数柯里化。我先稍微介绍一下吧。

就像我们中学的数学一样,我们定义了一个函数 z = x + y (1),然后我们通过某种方式

计算得出x = 2,这上面的公式(1)可以推演成

z = x + y (1)

z = 2 + y (2)

这个就是一个柯里化的过程。

对于第一种方式来说.事实上他可以看成是这样的,首先他是一个接受一个参数x的函数,

然后它接收了参数x,用x替换了函数体里的x,然后它又返回了另外一个接受一个参数y的函数

最后它才接受了y,返回了最终的值。大致步骤可分解为如下的过程:


  let f1 = (function x -> function y -> x + y)

  let f2 = f1 1

  //这时f2 = (function y -> 1 + y)

  let f3 = f2 2

  //在这个时候他才返回了最终的值3


 

事实上函数柯里化除了在学数学的时候有用,在其他很多地方都是有许多用处的,

不过还是以后我再写一些介绍吧,哈~跑题了。

   

posted on 2010-09-17 11:55  兴说:  阅读(274)  评论(0编辑  收藏  举报