5.5.2.1 函数作为参数值和返回值
来源:互联网 发布:linux 被 扫描 编辑:程序博客网 时间:2024/09/21 06:32
5.5.2.1 函数作为参数值和返回值
在第三章,我们已使用过,在 C# 和 F# 中把函数作为参数值,因此,这些基本概念不应该是新的;然而,我们还没有以这种方式使用过 lambda 函数。Lambda 函数是把函数写成另外函数的参数值的最简单方法。清单 5.17 提供了一个简单的示例。在清单中前面的函数,参数为一个数和一个函数,两次调用这个函数,第一次调用的结果作为第二次调用的参数值。
清单 5.17 在 C# 中 F# 中,函数作为参数值
// C# version
int Twice(int input, Func f) { [1]
return f(f(input));
}
var result = Twice(2, n => n * n); [2]
// F# version
> let twice (input:int) f =f(f(input));; [3]
val twice : int -> (int -> int) –>int [4]
> twice 2 (fun n -> n * n);; [5]
val it : int = 16
在这个示例中,我们在一个地方看到所有重要的功能。它显示如何声明 C# 方法和 F# 函数,把函数作为参数值([1]和[3]),以及如何使用 lambda 函数调用它们([2]和[5])。在 F# 中,我们使用到类型批注,告诉 F# 编译器,我们只需要整数。我们在下一章可以看到,没有这个批注,可能自动使函数更为通用。这通常是可取的,但我们希望保持示例尽可能简单。
在 C# 版本中,Twice 是方法,把委托作为参数,而在 F# 版本中,它是函数。当我们看到 F# 签名时[4],能够发现,它的构造就是函数类型构造器(箭头);第二个参数是函数,参数为一个整数,返回一个整数,整体类型是有两个参数的函数。
因为函数就是普通值,因此,我们写的函数(或 C# 中的方法),也可以把函数作为结果返回。清单 5.18 是一个函数,参数为一个数字,返回一个函数,把这个数字和任何给定的参数值加起来。
清单 5.18 在C# 和 F# 中,把函数作为返回值
C#
F#
Func Adder(int n) {
return (a) => a + n; [1]
}
Func add10 = [3]
Adder(10);
var r = add10(15); [5]
// Result: r == 25
> let adder(n) =
(fun a -> a + n);; [1]
val adder : int -> int –> int [2]
> let addTen = adder 10;; [3]
val addTen : (int -> int) [4]
> addTen 15;; [5]
val it : int = 25
Adder 的参数为一个整数[1],返回结果为一个函数。在C# 中,显式指定了返回类型,是 Func 委托,而在 F# 中,返回类型是由类型推断推导出来的,是函数,其类型为 int -> int。
后面我们会看到,输出的类型签名表明,函数的参数为整数,返回函数[2]。如果我们给输出的签名加上括号,可以看得更清楚,那么,会写成 int-> (int-> int)。
调用返回函数的函数(或 C# 的方法)[3],在 C# 中,结果是委托,在 F# 中,是普通的函数。正如输出的类型签名所示的[4],参数为整数,返回整数。
调用返回的函数(或 C# 中的 Func 委托),在 F# 中,我们把它作为普通的函数使用,在 C# 中,把它作为委托调用。
清单 5.18 使用一个简单的示例,展示了函数作为返回值,但在后面几章中我们将会看到,从一个函数返回另一个函数,更有用。关于这个代码,有一件事值得进一步解释。如果我们看看 F# Adder 函数的类型签名,可以发现,其类型是 int-> int-> int,。这看起来像有两个参数的函数,而如果像 int-> (int-> int),可能更容易理解。它们的意思是一样的,因为,F# 和其他函数语言,对有多个参数的函数,通常表示方法不同,[当然是]按通常的面向对象所理解的。
- 5.5.2.1 函数作为参数值和返回值
- CArray作为函数参数和返回值
- Golang interface{} 作为函数参数和函数返回值例子
- C++ 多维数组作为函数的返回值和参数
- 结构体变量作为函数的参数和返回值
- 结构体变量作为函数的参数和返回值 .
- 数组作为函数的参数和返回值
- js中函数可以作为参数和返回值
- C++引用(作为函数参数和返回值)
- 对象作为参数和返回值 复制(拷贝)构造函数
- “引用作为函数参数”与 “引用作为函数返回值”
- swift3新路程(7)函数的嵌套、作为返回值和作为函数的参数
- 引用作为函数参数返回值
- 案例:Python将函数作为参数以及作为返回值
- swift-函数04-函数作为参数,返回值,输入输出参数
- vector 作为参数和返回值
- js匿名函数作为函数参数 (返回值作为另一个函数的参数)
- Golang中interface{}作为函数参数和函数返回值的使用
- Android经典的开源项目(转载)
- js获取鼠标和滚动条位置
- Cookie和Session的区别详解
- 【干货】国外程序员整理的 C++ 资源大全
- Screen操作
- 5.5.2.1 函数作为参数值和返回值
- 关于arraylist的五个提问
- [LeetCode] Roman to Integer
- arm9 mini2440 pwm 控制直流无刷电机
- leetcode:Pascal's Triangle
- bash下快速移动光标的快捷键
- 使用connect的bodyParser中间件上传文件
- 国产手游开源引擎Beyond Engine简介 [附视频]
- 对solr中2个关键xml的熟悉