甲类型值是这样的值,分类的其它值。按类型分类的值被称为符合该类型。M型系统由以下几种类型组成:
binary
, date
, datetime
, datetimezone
, duration
, list
, logical
, null
, number
, record
, text
, time
, type
)并且还包括许多抽象类型(function
, table
, any
, and none
)该组的原始类型包括类型原始值的数的抽象类型,种类不唯一地进行分类的任何值:function
,table
,any
,和none
。所有函数值都符合抽象类型function
,所有表值都符合抽象类型table
,所有值都符合抽象类型any
,没有值符合抽象类型none
。type 的表达式none
必须引发错误或无法终止,因为无法生成符合 type 的值none
。请注意,原始类型function
和table
是抽象的,因为没有函数或表直接属于这些类型。原始类型record
和list
是非抽象的,因为它们分别表示没有定义字段的开放记录和类型为 any 的列表。
所有不是原始类型封闭集成员的类型统称为自定义类型。自定义类型可以使用type-expression
:
类型表达式:
主表达式
type
主类型
类型:
括号表达式
主类型
主类型:
原始类型
记录类型
列表类型
函数类型
表类型
可空类型
原始类型:其中之一
any binary date datetime datetimezone duration function list logical
none null number record table text time type
该原始型名称上下文关键字只有一个公认的类型的上下文。在类型上下文中使用括号将语法移回正则表达式上下文,需要使用 type 关键字移回类型上下文。例如,要在类型上下文中调用函数,可以使用括号:
复制
type nullable ( Type.ForList({type number}) )
// type nullable {number}
括号也可用于访问名称与原始类型名称冲突的变量:
复制
let record = type [ A = any ] in type {(record)}
// type {[ A = any ]}
以下示例定义了一个对数字列表进行分类的类型:
复制
type { number }
类似地,以下示例定义了一个自定义类型,该类型对具有必填字段命名X
且Y
值为数字的记录进行分类:
复制
type [ X = number, Y = number ]
使用标准库函数获得值的归属类型Value.Type
,如以下示例所示:
复制
Value.Type( 2 ) // type number
Value.Type( {2} ) // type list
Value.Type( [ X = 1, Y = 2 ] ) // type record
该is
运算符用于确定值的类型是否与给定类型兼容,如以下示例所示:
复制
1 is number // true
1 is text // false
{2} is list // true
的as
操作者检查该值是否与给定的类型兼容,并且如果它是不引发错误。否则,它返回原始值。
复制
Value.Type( 1 as number ) // type number
{2} as text // error, type mismatch
请注意,is
和as
运算符仅接受原始类型作为其右操作数。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
。
以下示例说明了声明同类列表类型的语法:
复制
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:
optional
opt field- name field-type-specification opt
field-type-specification:
=
field-type
field-type:
type
open-record-marker:
...
对记录类型求值的结果是一个类型值,其基类型为record
。
以下示例说明了声明记录类型的语法:
复制
type [ X = number, Y = number]
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ]
type [ Name = text, ... ]
默认情况下记录类型是关闭的,这意味着字段规范列表中不存在的其他字段不允许出现在符合标准的值中。在记录类型中包含openrecord-marker声明类型为open,这允许字段规范列表中不存在的字段。下面两个表达式是等价的:
复制
type record // primitive type classifying all records
type [ ... ] // custom type classifying all records
如果值是记录并且满足记录类型中的每个字段规范,则该值符合记录类型。如果以下任何一项为真,则满足字段规范:
当且仅当记录类型是开放的时,符合的值可能包含未在字段规范列表中列出的字段名称。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。