6.7.1 用F# 实现列表

来源:互联网 发布:冰点还原精灵类似软件 编辑:程序博客网 时间:2024/04/30 10:54

6.7.1 用F# 实现列表

 

虽然我们已经使用过 F# 中的列表,还用 C# 实现了相同的功能,但还没有研究如何用F# 实现列表类型。当我们前面讨论列表时,看到列表既可以表示为空值(nil)(空列表),也可以表示包含元素和引用列表其余部分的 cons cell。

现在,如果我们回顾上一章中有关值的内容,这就像是有两个选项的可选值;微有一点稍不同,列表类型是递归的,因此,cons cell 包含了列表自身类型的值。清单 6.19 是一个列表类型的定义,与 F# 标准库类似。

 

清单6.19 定义函数式列表类型 (F#)

> type List<'T> =  [1]

   |Nil    [2]

   |Cons of 'T * List<'T>    [3]

type List<'T> = (...)

 

> let list = Cons(1, Cons(2, Cons(3,Nil)));;  <-- 创建了包含 1、2、3 的列表

val list : List<'T>

 

这个类型写成有一个类型参数的泛型类型[1],类型参数表示保存在列表中值的类型。F# 中的可选值用差别联合表示,并且这个特定的联合有两个识别器,第一个[2]表示空列表,第二个[3]表示列表,有一个元素(类型为 'T),和指向列表其余部分的引用,其类型递归地写作 List<'T>。

示例代码的最后一行创建了有三个元素的列表,Cons 构造函数的第一个参数值总是数字,第二个参数值是列表,依次使用另外的 Cons 或 the Nil 识别器构建;内置的 F # 列表类型也完全是用这种方式声明的。先前,我们处理列表使用两个基元,:: 构造函数对应于定义中的 Cons,[] 表示空值。

一般情况下,创建递归的差别联合类型是表示程序数据的一种常见方式,我们将在下一章讨论。列表类型介于简单值与复杂的程序数据之间,两种方式都可以解释,具体取决于它在程序中如何使用。我们还将看到递归联合能够表示许多标准的设计模式,但现在,我们要回到高阶函数,它使列表更易于处理。

0 0
原创粉丝点击