首页 > 代码库 > 12.1.1 使用高阶函数

12.1.1 使用高阶函数

12.1.1 使用高阶函数

 

在F# 中,处理序列的函数在Seq 模块中,我们将解释一个非常普通的函数,Seq.unfold。可以看到,与fole 函数是一对,它的参数为集合,把集合“折叠”成一个值;unfold 的参数一个值,把这个值“展开”为序列。下面的代码片断生成的序列,包含格式化为字符串的、 0 到10 的数字:

 

> let nums = Seq.unfold (fun num –>

     if(num <= 10) then Some(string(num), num + 1) else None) 0

;;

val nums : seq<string> = seq ["0";"1"; "2"; "3"; ...]

 

num 值表示在序列生成过程中使用的状态。当第一次调用 lambda 函数时,num 的值设置为第二个参数的初始值(在本例中为零);Lambda 函数返回包含元组的选项类型值,None 值标志序列的结束,当返回Some 时,我们在元组中给它两个不同值:

■一个值,在序列中返回(这里,转换为字符串的数字)。

■另一个值,是用于lambda 函数下一次调用时的新的状态。

从输出中可以发现,返回值的类型是seq<string>,这是 IEnumerable<string>类型的 F# 类型别名。同样的类型可以有不同方式,同样,float 是System.Single 的C# 别名,所以,可以自由地混合使用。输出还显示了序列的前面几个元素,因为这个序列可能是无穷的,所以,F# 交互控制台不会尝试输出所有的值。

标准的.NET 库没有为C# 包含类似的方法。在C# 中,很少的几个方法之一,是生成序列的Enumerable.Range(来自System.Linq 命名空间),返回升序的数字序列,指定长度(第二个参数),指定起始数(第一个参数)。我们也可以在C# 中实现类似Seq.unfold 的函数,但我们将会看到类似结果,可以很容易地通过使用C# 迭代实现,下一节我们就来看一下。

12.1.1 使用高阶函数