6.7.1 F# 中实现列表

728 篇文章 1 订阅
30 篇文章 0 订阅

6.7.1 F# 中实现列表

 

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

    现在,如果我们看看上一章中的值的图库,这与带有两个选项的可选值完全一样。有一点稍微不同, 列表类型是递归的,这意味着,cons cell 包含类型为列表自身的值。清单 6.19 显示了一个类型定义,创建一个的列表类型,与 F# 标准库中的类似。

 

Listing 6.19 Definition of a functional list type (F#)

 

> type List<'T> =
     | Nil
     | Cons of 'T * List<'T>
type List<'T> = (...)

> let list = Cons(1, Cons(2, Cons(3, Nil)));;
val list : List<'T>

 

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值