5.5.2 函数类型
我们已经看到,在 F# 中,用箭头符号写函数值的类型,这在很多方面类似于构造元组的方式。早些时候,我们看到过,可以使用带类星号(int * string)的类型构造器,从其他简单类型,构造出元组类型。构造函数类型的方法类似,只是使用函数类型构造器(int -> string)。在数学意义上,函数就是描述每个可能的输入和返回值之间的关系,因此,不需要指定大量的关系的所有组合,只需要描述用 lambda 函数计算出结果的代码。
在 C# 中,也可以看到这种相似性。如果我们使用自己的Tuple 泛型类型和 Func 委托,可以把前一段的示例重写成 Tuple<int, string> 和 Func<int,string>。像我们在 F# 中所做的那样,不使用内置的类型,用泛型,把相似的构造实现成普通的 C# 类型。在 F# 的函数类型与 C# 的Func (或 Action)委托之间有非常的重要区别:普通的 F# 函数类型与写成 lambda 函数的等价函数的类型相同。在 C# 中,lambda 函数被转换为委托,委托与方法不是一回事,区别很小,但很重要:当考虑在 F# 中使用多个参数的函数时,会看得更清楚。现在,我们要研究一下如何把函数值当作参数值或返回值使用。