F#教程:高阶函数

所谓高阶函数就是将某个函数作为输入参数或者返回值的函数。从名字上来看挺难理解的,不过从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。

时间: 2024-10-26 05:26:20

F#教程:高阶函数的相关文章

F#教程-定义高阶函数

目前为止我们已经尝试写了些高阶函数代码.这回我们学着定义如下高阶函数: f(g,a) = g(g(a)) 该函数在得到函数g和传入g的参数a后计算g(a),并将结果作为再次调用函数g的参数.语言描述确实很复杂. F#表示如下: let f g a = g (g a) 使用Pipeline就可以改写成: let f g a = g a |> g C#的话可能会像这样: public T f<T>(Func<T,T> g, T a) { return g(g(a)); } F#就

Scala入门到精通——第十三节 高阶函数

本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返回值是函数的函数.这两种在本教程的第五节 函数与闭包中已经有所涉及,这里简单地回顾一下: (1)函数参数 //函数参数,即传入另一个函数的参数是函数 //((Int)=>String)=>String scala> def convertIntToString(f:(Int)=>Str

Kotlin 简单优雅的高阶函数

Kotlin 简单优雅的高阶函数 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程http://www.jianshu.com/p/35b487734339 函数代表一种关系 f 的蕴涵逻辑流.这种蕴涵逻辑流,其实就是映射(Mapping). 一切皆是映射. 我们说组合是编程的本质,其实,组合就是建立映射关系. 我们说, 程序 = 算法+数据结构 我们把程序看做图论里面的一张图G,这里的数据结构就是图

高阶函数、委托与匿名方法

高阶函数(higher-order function)是指把另一个函数作为参数或返回值的函数.例如 在JavaScript语言中,Function是顶级类型.一个函数就是类型为 Function的顶级对象,自 然就可以作为另一个函数的参数或返回值.例如在Microsoft AJAX Library(ASP.NET AJAX 的客户端类库)中有一个被广泛使用的createDelegate方法.该方法接受一个对象A和一个函 数F作为参数,并返回一个函数R.当调用函 数R时,F函数将被调用,并且保证无

Javascript 高阶函数使用介绍

  高阶函数(higher-order function)-如果一个函数接收的参数为或返回的值为函数,那么我们可以将这个函数称为高阶函数.众所周知,JavaScript是一种弱类型的语言:JavaScript的函数既不对输入的参数,也不对函数的输出值作强定义和类型检查,那么函数可以成为参数,也可以成为输出值,这就体现了JavaScript对高阶函数的原生支持. 一.参数为函数的高阶函数: ? 1 2 3 4 5 6 function funcTest(f){ //简易判断一下实参是否为函数 if

函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分

本文讲的是函数式接口.默认方法.纯函数.函数的副作用.高阶函数.可变的和不可变的.函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分, 太棒了,我们又来到新的一天.这一次,我们要学一些新的东西让今天变得有意思起来. 大家好,希望你们都过得不错.这是我们的 RxJava2 Android 系列的第三篇文章. 第一部分 第二部分 在这篇文章中,我们将讨论函数式的接口,函数式编程,Lambda 表达式以及与 Java 8 的相关的其它内容.这

Coursera Scala 5-4:List的高阶函数

Coursera Scala 5-4:List的高阶函数 Recurring Patterns for Computations on Lists 重复出现的Lists计算模式 lists的很多函数有相似的结构,重复出现的模式有: 用某个方法转换每个元素 用某个条件提取元素 用某种方法链接元素 函数式编程语言,让程序员能写出更通用的计算模式,通过使用高阶函数. Applying a Function to Elements of a List 将一个list的所有元素,进行转换.例子:返回一个新

python精简笔记(四)——高阶函数

以Python内置的求绝对值的函数abs()为例 >>> f = abs >>> f(-10) 10 变量f现在已经指向了abs函数本身.直接调用abs()函数和调用变量f()完全相同. 函数名其实也是变量 abs指向10后,就无法通过abs(-10)调用该函数了!因为abs这个变量已经不指向求绝对值函数而是指向一个整数10 >>> abs = 10 >>> abs(-10) Traceback (most recent call l

javascript之典型高阶函数应用介绍二_javascript技巧

前言 在前一篇文章javascript之典型高阶函数中主要实现了几个典型的functional函数.文章最后也提出了疑问,为啥那样的实现与F#之类的函数式语言"不太一样"呢?今天来试试更"函数式"的实现. 另一种实现 同样地,尝试对之前实现的函数做一些改动,把for循环去掉.如何去掉呢?这里先要引入一个集合的归纳法定义: 一个集合要么是空集,要么是一个数与一个集合组成的数对从定义可以看到,每一个集合都可以看作为一个数和一个集合的对.例如:{1,2,4,5} 可以认为