Records

作者: christ_yang | 来源:发表于2020-06-21 23:07 被阅读0次

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

构建

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

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

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

注意

  • f可以是任何不重复的字段名称,设置可以是数字,e可以是任何表达式。
  • ML中使用Record不需要专门去声明其类型(和java、c、python不同),只需要直接使用,类型检查器会推断出正确的类型。
  • Record中字段的顺序是不重要的。
  1. 类型检查(type check):
  • 类型检查器会计算每表达式e,以获取正确的值和类型。
  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方法中都使用了混合的方式:

  • 函数调用者(caller)使用位置传递参数
  • 函数被调者(callee)使用参数名获取参数值

语法糖

(* 在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的语法糖。

:语法糖

  • “语法的”:即我们可以在语法层面用某种等效的方式(这里指tuple)来描述其相关的所有内容(即特殊的record)。
  • “糖:它使编程语法更“甜”,更方便。
  • 另外的例子:andalso、orelse vs if ... then ... else ...

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

使用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等的内容

相关文章

  • records

    遥远的时刻每天都在询问我, “这是窗户吗?”“这是生活吗?”我说 “是”,但其实我心里想说,“我不知道”,我不知道...

  • Records

    终于结束了《全球通史》下的阅读。粗略的读完了上下两本厚厚的史书后,见识与事物思考的宽度都不同了,虽是也有些不懂,通...

  • Records

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

  • mac - python环境修改

    —— Just for personal records.

  • Interview records

    20170905 maxus tao chassis packaging engineer 1.need to s...

  • ECM Records

  • Technical Records

    20/12/2018 超辐射LED(Superluminescent LED, SLED): 结合激光器和LED最...

  • Error Records

    1. Description:Failed to configure a DataSource: no embed...

  • Email records

    Hi Jim Please find attached pictures Fan quoted you the t...

  • Living expense account book

    This is an application that records the income and expens...

网友评论

      本文标题:Records

      本文链接:https://www.haomeiwen.com/subject/oegzxktx.html