Records

2020-06-21  本文已影响0人  christ_yang

Record是“each of”类型,先熟悉,然后将它与另一个“each of”类型Tuple对比。

构建

  1. 语法(syntax)
# Record值是有多个字段,每个字段都持有一个值
{f1 = v1, …, fn = vn}

# Record值是有多个字段,每个字段都持有一个类型
{f1 : t1, …, fn : tn}

# 构建Record
{f1 = e1, ..., fn = en} 

注意

  1. 类型检查(type check):
  1. 计算规则(evaluation rules)
    Record的计算规则是相似的,计算每个字段的表达式e,产生对应的字段的结果。

使用

{foo : int, bar : int*bool, baz : bool*int}
#foo e

foo是字段名,类型检查器需要e

  1. record类型
  2. 有名为foo的字段
    如果该字段有类型t,那么#foo e类型即为t。计算erecord值,然后生成foo字段的内容(值)。

实例

{name = "Amelia", id = 41123 - 12}
# 计算为:
{id = 41111, name = "Amelia"}
# 类型为
{id : int, name : string}

Record vs Tuple

recordtuple是非常类似的,它们都是each of类型,并可以包含任意数量的元素。唯一不同的是,record是通过字段名称(即feild)访问其值(注:这也是为何record中元素顺序不重要的原因),而tuple则是通过位置访问其值。

语言设计和使用选择:
recordtuple在某些情况下,都是好的选择。一般有:

  1. 较少的元素,使用tuple更简洁,方便
  2. 使用record更容易通过字段名定位元素
  3. 较大的复杂类型,2优势更明显

在编程语言中,使用位置(类似tuple)还是字段名(类似record)传递参数都是标准的、常见的设计方案,ML函数和java方法中都使用了混合的方式:

语法糖

(* 在REPLE中输入*)
val record_pair = {1 = 1, 2 =2}
(* 输出*)
val record_pair = (1, 2) : int * int
(* 作为record来使用*)
#1 record_pair + #2 record_pair;
(* 打印*)
val it = 3 : int

通过上面的小实验,我们知道在ML中,tuple实际上是特殊的一类record,也可以称tuple是该特殊record的语法糖。

:语法糖

该术语被广泛使用,也是将关键思想保留在编程语言中更小巧(更易实现)的一种好方法,同时也为程序员提供了方便的使用方法。

使用record来实现tuple有:

  1. 表达式:(e1, e2, ..., en)可写为{1=e1, ..., n=en},即一个tuple也是一个字段名为1,2,...,nrecord
  2. 类型:t1 * t2 ... * tn可写为{1:t1, 2:t3, ..., n:tn}
  3. 上面的表达式#1 e,#2等就表达了正确的事情了:获取字段名1,2等的内容
上一篇下一篇

猜你喜欢

热点阅读