5.2.2 元组类型和值的构造函数

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

5.2.2 元组类型和值的构造函数

 

我们已经知道元组值的类型是什么样子,在清单 5.1 再次看到。写元组类型使用星号,例如,保存整数和字符串的元组类型,写成 int * string。在这一章的概论部分,谈到值和类型时,我们说过,类型是所有可能值的域。如果用这种观点来审视元组类型:这种表示方法如何反映了元组类型是由几个基本类型组成的呢?

在这种表示方法中的星号是关键,因为它承担了类型构造函数(type constructor)[1]的作用,就是说,可以用星号把任何其他类型构造成元组类型。我们前面提到过,类型描述的是所有可能值的域。使用这个术语,描述了 int * string 类型值的域,包含了整数和字符串的所有可能组合。在 F# 中,很多时候不必显式写出类型,是由于类型推断的功劳,但是,知道类型是如何构造的,也非常有用。

另一方面,我们在写使用元组的代码时,都将使用值构造函数(value constructors);这种构造函数是更接近于在 C# 中使用的构造函数。值构造函数创建新的函数式值的方式,类似于在面向对象的构造函数中创建类的新实例。这是允许从用其他简单值创建元组类型值的语法,例如,(1,"hello") 演示了值构造函数的用法,它创建了属于描述整数和字符串所有可能组合的域中的一个特定值。要演示值和类型构造函数之间的关系,我们可以看另一个示例。下面的代码片断显示的是用元组表示消息,和它在屏幕上显示的X, Y 坐标:

 

> let msgAt1 = (50, 100, "Helloworld!");;

val msgAt1 : int * int * string

 

> let msgAt2 = ((50, 100), "Helloworld!");;

val msgAt2 : (int * int) * string

 

代码显示了两种不同的表示形式。第一种方法,我们使用了有三个元素的元组,把所有的基本值保存在一起,输出的类型签名反映了这一点,三个基本类型由星号分隔;第二种方法,我们首先构建一个元组,保存 X 和 Y 坐标,然后,再把这个值与消息组合成另一个元组,可以发现,该类型再次反映了这个构造架构。这两个类型之间的差异也是值得注意的。第一种类型是有三个元素的元组,而第二种是包含了一个元组和一个字符串的元组。因此,我们在构建元组时,应始终考虑可能的选项。在这里,我们应该选择第二种方法,因为,X 和 Y 值构成一个组合值表示坐标,更有逻辑;另一方面,表示消息的字符串值,与坐标几乎没有关系。如何更好地使用元组,下面有几个原则。

-----------

1 在 .NET 的术语中,类型构造函数(typeconstructor),当引用静态类的构造函数,在类型中初始化静态数据时使用。在这里,我们使用函数编程术语,类型构造函数用于从给定的类型构建新的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值