前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

类型

作者头像
冬夜先生
发布2022-01-05 09:54:42
4580
发布2022-01-05 09:54:42
举报
文章被收录于专栏:csicocsico

类型值是这样的值,分类的其它值。按类型分类的值被称为符合该类型。M型系统由以下几种类型组成:

  • 原始类型,对原始值进行分类(binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type)并且还包括许多抽象类型(function, table, any, and none
  • 记录类型,根据字段名称和值类型对记录值进行分类
  • 列表类型,使用单个项目基本类型对列表进行分类
  • 函数类型,根据其参数和返回值的类型对函数值进行分类
  • 表类型,根据列名、列类型和键对表值进行分类
  • 可空类型,除了按基本类型分类的所有值之外,还对值进行分类
  • 类型类型,对属于类型的值进行分类

该组的原始类型包括类型原始值的数的抽象类型,种类不唯一地进行分类的任何值:functiontableany,和none。所有函数值都符合抽象类型function,所有表值都符合抽象类型table,所有值都符合抽象类型any,没有值符合抽象类型none。type 的表达式none必须引发错误或无法终止,因为无法生成符合 type 的值none。请注意,原始类型functiontable是抽象的,因为没有函数或表直接属于这些类型。原始类型recordlist 是非抽象的,因为它们分别表示没有定义字段的开放记录和类型为 any 的列表。

所有不是原始类型封闭集成员的类型统称为自定义类型。自定义类型可以使用type-expression

类型表达式:       主表达式 type 主类型 类型:       括号表达式       主类型 主类型:       原始类型       记录类型       列表类型       函数类型       表类型       可空类型 原始类型:其中之一 any binary date datetime datetimezone duration function list logical none null number record table text time type

原始型名称上下文关键字只有一个公认的类型的上下文。在类型上下文中使用括号将语法移回正则表达式上下文,需要使用 type 关键字移回类型上下文。例如,要在类型上下文中调用函数,可以使用括号:

复制

代码语言:javascript
复制
type nullable ( Type.ForList({type number}) )   
// type nullable {number}

括号也可用于访问名称与原始类型名称冲突的变量:

复制

代码语言:javascript
复制
let  record = type [ A = any ]  in  type {(record)} 
// type {[ A = any ]}

以下示例定义了一个对数字列表进行分类的类型:

复制

代码语言:javascript
复制
type { number }

类似地,以下示例定义了一个自定义类型,该类型对具有必填字段命名XY值为数字的记录进行分类:

复制

代码语言:javascript
复制
type [ X = number, Y = number ]

使用标准库函数获得值的归属类型Value.Type,如以下示例所示:

复制

代码语言:javascript
复制
Value.Type( 2 )                 // type number 
Value.Type( {2} )               // type list 
Value.Type( [ X = 1, Y = 2 ] )  // type record

is运算符用于确定值的类型是否与给定类型兼容,如以下示例所示:

复制

代码语言:javascript
复制
1 is number          // true 
1 is text            // false 
{2} is list          // true

as操作者检查该值是否与给定的类型兼容,并且如果它是不引发错误。否则,它返回原始值。

复制

代码语言:javascript
复制
Value.Type( 1 as number )   // type number 
{2} as text                 // error, type mismatch

请注意,isas运算符仅接受原始类型作为其右操作数。M 不提供检查值是否符合自定义类型的方法。

A型X兼容与类型Y,当且仅当符合所有值X也符合Y。所有类型都与 type 兼容,any没有类型(但none它本身)与 type 兼容none。下图显示了兼容性关系。(类型兼容性是自反和可传递的。它形成了一个以类型any为顶部,类型none为底部值的格子。)抽象类型的名称设置为斜体

类型兼容性
类型兼容性

为类型值定义了以下运算符:

操作员

结果

x = y

平等的

x <> y

不相等

x ?? y

合并

类型值的本机类型是内在类型type

原始类型

M 语言中的类型形成了一个以 typeany为根的不相交层次结构,它是对所有值进行分类的类型。任何 M 值都恰好符合 的一种原始子类型any。从 type 派生的原始类型的封闭集any如下:

  • type null,它对空值进行分类。
  • type logical,它将值分类为真和假。
  • type number,它对数值进行分类。
  • type time,它对时间值进行分类。
  • type date,它对日期值进行分类。
  • type datetime,它对日期时间值进行分类。
  • type datetimezone,它对日期时区值进行分类。
  • type duration,它对持续时间值进行分类。
  • type text,它对文本值进行分类。
  • type binary,它对二进制值进行分类。
  • type type,它对类型值进行分类。
  • type list,它对列表值进行分类。
  • type record,它对记录值进行分类。
  • type table,它对表值进行分类。
  • type function,它对函数值进行分类。
  • type anynonnull,它对除 null 之外的所有值进行分类。固有类型不none分类任何值。

任意种类

类型any是抽象的,对 M 中的所有值进行分类,并且 M 中的所有类型都与 兼容any。类型变量any可以绑定到所有可能的值。因为any是抽象的,所以它不能归于值——也就是说,没有值是直接的类型any

列表类型

作为列表的任何值都符合固有类型list,它不会对列表值中的项目设置任何限制。

列表类型: { 项目类型 } 项目类型:       类型

评估列表类型的结果是一个列表类型值,其基类型为list

以下示例说明了声明同类列表类型的语法:

复制

代码语言:javascript
复制
type { number }        // list of numbers type 
     { record }        // list of records type
     {{ text }}        // list of lists of text values

如果该值是一个列表并且该列表值中的每个项目都符合该列表类型的项目类型,则该值符合该列表类型。

列表类型的项目类型表示一个界限:符合列表的所有项目都符合项目类型。

记录类型

作为记录的任何值都符合固有类型记录,它不会对记录值中的字段名称或值施加任何限制。甲记录类型值被用于限制该组有效名称的,以及被允许与这些名称相关联的值的类型。

记录类型: [ open-record-marker ] [ field-specification-list opt ] [ field-specification-list , open-record-marker ] field-specification-list:       field-specification       field-specification , field-specification-list field-specification: optionalopt field- name field-type-specification opt field-type-specification: = field-type field-type:       type open-record-marker: ...

记录类型求值的结果是一个类型值,其基类型为record

以下示例说明了声明记录类型的语法:

复制

代码语言:javascript
复制
type [ X = number, Y = number] 
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ] 
type [ Name = text, ... ]

默认情况下记录类型是关闭的,这意味着字段规范列表中不存在的其他字段不允许出现在符合标准的值中。在记录类型中包含openrecord-marker声明类型为open,这允许字段规范列表中不存在的字段。下面两个表达式是等价的:

复制

代码语言:javascript
复制
type record   // primitive type classifying all records 
type [ ... ]  // custom type classifying all records

如果值是记录并且满足记录类型中的每个字段规范,则该值符合记录类型。如果以下任何一项为真,则满足字段规范:

  • 记录中存在与规范标识符匹配的字段名称,并且关联的值符合规范的类型
  • 规范被标记为可选,并且在记录中没有找到对应的字段名称

当且仅当记录类型是开放的时,符合的值可能包含未在字段规范列表中列出的字段名称。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原始类型
  • 任意种类
  • 列表类型
  • 记录类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档