F#教程:高阶函数 - 面向对象网 f# 学习 对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > F# > 正文

F#教程:高阶函数

来源: www.bianceng.cn 阅读:

所谓高阶函数就是将某个函数作为输入参数或者返回值的函数。从名字上来看挺难理解的,不过从C#的角度来看就是传入或返回delegate之类的。

在我们自己定义高阶函数之前我们还是先学会使用高阶函数。

List中定义了很多高阶函数,这回就学习下其中的几个。首先试下find函数。

let list = [15; 7; 8; 3; 6; 10]
let even n = n % 2 = 0 
let x = List.find even list
printfn "%A" x

其中,find的第一个参数是函数,第二个参数是传入的list。将第一个参数指定的函数作用于list的各个元素,如果结果是True,就将该元素作为返回值。这个例子就是寻找第一个偶数。

运行结果是显示8。和.NET Framework的List.Find方法有点相似吧。

不过如果这样写也是可以的:

let list = [15; 7; 8; 3; 6; 10]
let x = List.find    (fun n -> n % 2 = 0) list
printfn "%A" x

将lambda表达式作为find的输入参数。我认为这种写法应该是经常使用的。

接着我们看下exists函数。exists函数用来判断 list中是否有符合输入函数所指定条件的元素,如果有就返回True。

let list = [15; 7; 8; 3; 6; 10]
let even n = n % 2 = 0 
let x = List.exists even list
printfn "%A" x

接着我们试着使用下map函数。map函数可以使得传入的函数分别作用于 list的各个元素,计算的结果组成新的list返回。

let list = [15; 7; 8; 3; 6; 10]
let x = List.map (fun n -> n % 2 = 0) list
printfn "%A" x

运行结果是:

[false; false; true; false; true; true]

感觉是不是很像LINQ的Select方法啊!

也许可能有些人无法理解高阶函数。但如果可以理解lambda,就不难理解它了。

我们继续了解List提供的其他函数。先看看sortBy。按照字符串长度排序的代码如下:

let list = ["oracle"; "microsoft"; "ibm"; "google" ]
let x = List.sortBy (fun n -> n.Length) list
printfn "%A" x

但是在Length处有一个编译错误,原因是无法判断n是否有Length属性。知道这个原因后,修改起来也很简单:

let list = ["oracle"; "microsoft"; "ibm"; "google" ]
let x = List.sortBy (fun (n:string) -> n.Length) list
printfn "%A" x

其中,n的类型被显示指定为string。

接着我们看下filter函数。该函数用来过滤出和lambda表达式所指定条件的相符合的元素。

let list = [1;2;3;4;5]
let x = List.filter (fun n -> n % 2 = 0) list
printfn "%A" x

这和LINQ的Where方法类似。运行结果是[2; 4]。

iter函数对应的就是C#的ForEach方法。

let list = [1;2;3;4;5]
let x = List.iter (fun n -> printfn "%A" n) list

上述代码的运行结果就是顺次显示1到5。

Tags:
相关文章列表: