TiposTypes

Um valor de tipo é um valor que classifica outros valores.A type value is a value that classifies other values. Um valor classificado por um tipo obedece a esse tipo.A value that is classified by a type is said to conform to that type. O sistema de tipos de M é composto pelas seguintes categorias de tipos:The M type system consists of the following kinds of types:

  • Tipos primitivos, que classificam valores primitivos (binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type) e incluem alguns tipos abstratos (function, table, any e none)Primitive types, which classify primitive values (binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type) and also include a number of abstract types (function, table, any, and none)

  • Tipos de registro, que classificam valores de registro com base em nomes de campo e em tipos de valorRecord types, which classify record values based on field names and value types

  • Tipos de lista, que classificam listas usando apenas um tipo de base de itemList types, which classify lists using a single item base type

  • Tipos de função, que classificam valores de função com base nos tipos de seus parâmetros e valores de retornoFunction types, which classify function values based on the types of their parameters and return values

  • Tipos de tabela, que classificam valores de tabela com base em nomes de coluna, tipos de coluna e chavesTable types, which classify table values based on column names, column types, and keys

  • Tipos anuláveis, que classificam o valor nulo além de todos os valores classificados por um tipo baseNullable types, which classifies the value null in addition to all the values classified by a base type

  • Tipos de tipo, que classificam valores que são tiposType types, which classify values that are types

O conjunto de tipos primitivos inclui os tipos de valores primitivos de alguns tipos abstratos, que são tipos que não classificam os valores de maneira exclusiva: function, table, any e none.The set of primitive types includes the types of primitive values a number of abstract types, types that do not uniquely classify any values: function, table, any, and none. Todos os valores de função obedecem o tipo abstrato function; todos os valores de tabela, o tipo abstrato table; todos os valores, o tipo abstrato any e nenhum valor, o tipo abstrato none.All function values conform to the abstract type function, all table values to the abstract type table, all values to the abstract type any, and no values to the abstract type none. Uma expressão do tipo none deve gerar um erro ou falhar ao ser encerrada, pois não é possível produzir nenhum valor que obedeça o tipo none.An expression of type none must raise an error or fail to terminate since no value could be produced that conforms to type none. Observe que os tipos primitivos function e table são abstratos, porque nenhuma função ou tabela é diretamente desses tipos, respectivamente.Note that the primitive types function and table are abstract because no function or table is directly of those types, respectively. Os tipos primitivos record e list não são abstratos porque representam um registro aberto sem campos definidos e uma lista do tipo any, respectivamente.The primitive types record and list are non-abstract because they represent an open record with no defined fields and a list of type any, respectively.

Todos os tipos que não são membros do conjunto fechado de tipos primitivos são chamados coletivamente de tipos personalizados.All types that are not members of the closed set of primitive types are collectively referred to as custom types. Tipos personalizados podem ser escritos usando um type-expression:Custom types can be written using a type-expression:

expressão-de-tipo:
      expressão-primária
type-expression:
      primary-expression

      type tipo-primário
tipo:
      expressão-entre-parênteses
      tipo-primário
tipo-primário:
      tipo-primitivo
      tipo-de-registro
      tipo-de-lista
      tipo-de-função
      tipo-de-tabela
      tipo-anulável
tipo-primitivo:
um entre
      type primary-type
type:
      parenthesized-expression
      primary-type
primary-type:
      primitive-type
      record-type
      list-type
      function-type
      table-type
      nullable-type
primitive-type:
one of

      any binary date datetime datetimezone duration function list logical      any binary date datetime datetimezone duration function list logical
      none null number record table text time type      none null number record table text time type

Os nomes de tipo-primitivo são palavras-chave contextuais reconhecidas somente em um contexto de tipo.The primitive-type names are contextual keywords recognized only in a type context. O uso de parênteses em um contexto de tipo muda a gramática de volta para o contexto de expressão regular, exigindo o uso da palavra-chave type para voltar para o contexto de tipo.The use of parentheses in a type context moves the grammar back to a regular expression context, requiring the use of the type keyword to move back into a type context. Por exemplo, para invocar uma função em um contexto de tipo, os parênteses podem ser usados:For example, to invoke a function in a type context, parentheses can be used:

type nullable ( Type.ForList({type number}) )   
// type nullable {number}

Os parênteses também podem ser usados para acessar uma variável cujo nome colide com um nome de tipo-primitivo:Parentheses can also be used to access a variable whose name collides with a primitive-type name:

let  record = type [ A = any ]  in  type {(record)} 
// type {[ A = any ]}

O exemplo a seguir define um tipo que classifica uma lista de números:The following example defines a type that classifies a list of numbers:

type { number }

De maneira semelhante, o exemplo a seguir define um tipo personalizado que classifica os registros com campos obrigatórios chamados X e Y, cujos valores são números:Similarly, the following example defines a custom type that classifies records with mandatory fields named X and Y whose values are numbers:

type [ X = number, Y = number ]

O tipo atribuído de um valor é obtido usando a função de biblioteca padrão Value.Type, conforme mostrado nos exemplos a seguir:The ascribed type of a value is obtained using the standard library function Value.Type, as shown in the following examples:

Value.Type( 2 )                 // type number 
Value.Type( {2} )               // type list 
Value.Type( [ X = 1, Y = 2 ] )  // type record

O operador is é usado para determinar se o tipo de um valor é compatível com um determinado tipo, conforme mostrado nos exemplos a seguir:The is operator is used to determine whether a value's type is compatible with a given type, as shown in the following examples:

1 is number          // true 
1 is text            // false 
{2} is list          // true

O operador as verifica se o valor é compatível com o tipo determinado e gera um erro se não for.The as operator checks if the value is compatible with the given type, and raises an error if it is not. Caso contrário, ele retorna o valor original.Otherwise, it returns the original value.

Value.Type( 1 as number )   // type number 
{2} as text                 // error, type mismatch

Observe que os operadores is e as só aceitam tipos primitivos como o operando à direita.Note that the is and as operators only accept primitive types as their right operand. A linguagem M não fornece um meio de verificar os valores quanto à conformidade com tipos personalizados.M does not provide means to check values for conformance to custom types.

Um tipo X é compatível com um tipo Y se, e somente se, todos os valores que obedecem X também obedecem Y.A type X is compatible with a type Y if and only if all values that conform to X also conform to Y. Todos os tipos são compatíveis com o tipo any e nenhum tipo (exceto pelo próprio none) é compatível com o tipo none.All types are compatible with type any and no types (but none itself) are compatible with type none. O gráfico a seguir mostra a relação de compatibilidade.The following graph shows the compatibility relation. (A compatibilidade do tipo é reflexiva e transitiva.(Type compatibility is reflexive and transitive. Ele forma um malha com o tipo any como o valor superior e o tipo none como o inferior.) Os nomes dos tipos abstratos estão em itálico.It forms a lattice with type any as the top and type none as the bottom value.) The names of abstract types are set in italics.

Compatibilidade de tipo

Os seguintes operadores são definidos para os valores de tipo:The following operators are defined for type values:

OperadorOperator ResultadoResult
x = y IgualEqual
x <> y DiferenteNot equal

O tipo nativo de valores de tipo é o tipo intrínseco type.The native type of type values is the intrinsic type type.

Tipos primitivosPrimitive Types

Os tipos na linguagem M formam uma hierarquia não contígua enraizada no tipo any, que é o tipo que classifica todos os valores.Types in the M language form a disjoint hierarchy rooted at type any, which is the type that classifies all values. Qualquer valor de M obedece exatamente um subtipo primitivo de any.Any M value conforms to exactly one primitive subtype of any. O conjunto fechado de tipos primitivos derivados do tipo any é o seguinte:The closed set of primitive types deriving from type any are as follows:

  • type null, que classifica o valor nulo.type null, which classifies the null value.
  • type logical, que classifica os valores true e false.type logical, which classifies the values true and false.
  • type number, que classifica valores numéricos.type number, which classifies number values.
  • type time, que classifica valores de tempo.type time, which classifies time values.
  • type date, que classifica valores de data.type date, which classifies date values.
  • type datetime, que classifica valores de datetime.type datetime, which classifies datetime values.
  • type datetimezone, que classifica valores de datetimezone.type datetimezone, which classifies datetimezone values.
  • type duration, que classifica valores de duração.type duration, which classifies duration values.
  • type text, que classifica valores de texto.type text, which classifies text values.
  • type binary, que classifica valores binários.type binary, which classifies binary values.
  • type type, que classifica valores de tipo.type type, which classifies type values.
  • type list, que classifica valores de lista.type list, which classifies list values.
  • type record, que classifica valores de registro.type record, which classifies record values.
  • type table, que classifica valores de tabela.type table, which classifies table values.
  • type function, que classifica valores de função.type function, which classifies function values.
  • type anynonnull, que classifica todos os valores, exceto por nulo.type anynonnull, which classifies all values excluding null. O tipo intrínseco none não classifica nenhum valor.The intrinsic type none classifies no values.

Tipo anyAny Type

O tipo any é abstrato, ele classifica todos os valores em M e todos os tipos em M são compatíveis com any.The type any is abstract, classifies all values in M, and all types in M are compatible with any. Variáveis do tipo any podem ser associadas a todos os valores possíveis.Variables of type any can be bound to all possible values. Como any é abstrato, ele não pode ser atribuído a valores—ou seja, nenhum valor tem diretamente o tipo any.Since any is abstract, it cannot be ascribed to values—that is, no value is directly of type any.

Tipos de listaList Types

Qualquer valor que seja uma lista obedece o tipo intrínseco list, que não estabelece nenhuma restrição sobre os itens dentro de um valor de lista.Any value that is a list conforms to the intrinsic type list, which does not place any restrictions on the items within a list value.

tipo-de-lista:list-type:
      { tipo-de-item }      { item-type }
tipo-de-item:
      tipo
item-type:
      type

O resultado da avaliação de um tipo-de-lista é um valor de tipo de lista cujo tipo base é list.The result of evaluating a list-type is a list type value whose base type is list.

Os exemplos a seguir ilustram a sintaxe para declarar tipos de lista homogêneos:The following examples illustrate the syntax for declaring homogeneous list types:

type { number }        // list of numbers type 
     { record }        // list of records type
     {{ text }}        // list of lists of text values

Um valor obedece um tipo de lista se o valor é uma lista e cada item nesse valor de lista obedece o tipo de item do tipo de lista.A value conforms to a list type if the value is a list and each item in that list value conforms to the list type's item type.

O tipo de item de um tipo de lista indica uma associação: todos os itens de uma lista compatível obedecem o tipo de item.The item type of a list type indicates a bound: all items of a conforming list conform to the item type.

Tipos de registroRecord Types

Qualquer valor que seja um registro obedece o tipo intrínseco record, que não estabelece nenhuma restrição sobre os itens dentro de um valor de registro.Any value that is a record conforms to the intrinsic type record, which does not place any restrictions on the field names or values within a record value. Um valor-de-tipo-de-registro é usado para restringir o conjunto de nomes válidos, bem como os tipos de valores que têm permissão para ser associados a esses nomes.A record-type value is used to restrict the set of valid names as well as the types of values that are permitted to be associated with those names.

tipo-de-registro:record-type:
      [ marcador-de-registro-aberto ]      [ open-record-marker ]
      [ lista-de-especificação-de-camposopt ]      [ field-specification-listopt ]
      [ lista-de-especificações-de-campo, marcador-de-registro-aberto ]      [ field-specification-list , open-record-marker ]
lista-de-especificações-de-campo:
      especificação-de-campo
      especificação-de-campo , lista-de-especificações-de-campo
especificação-de-campo:
field-specification-list:
      field-specification
      field-specification , field-specification-list
field-specification:

      optionalopt nome-do-campo especificação-de-tipo-de-campoopt
especificação-de-tipo-de-campo:
      optionalopt field-name field-type-specificationopt
field-type-specification:

      = tipo-de-campo
tipo-de-campo:
      tipo
marcador-de-registro-aberto:
      = field-type
field-type:
      type
open-record-marker:

      ...      ...

O resultado da avaliação de um tipo-de-registro é um valor de tipo cujo tipo base é record.The result of evaluating a record-type is a type value whose base type is record.

Os exemplos a seguir ilustram a sintaxe para declarar tipos de registro:The following examples illustrate the syntax for declaring record types:

type [ X = number, Y = number] 
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ] 
type [ Name = text, ... ]

Os tipos de registro são fechados por padrão, o que significa que campos adicionais que não estão presentes na lista-de-especificações-de-campo não podem estar presentes em valores compatíveis.Record types are closed by default, meaning that additional fields not present in the fieldspecification-list are not allowed to be present in conforming values. Incluir o marcador-de-registro-aberto no tipo de registro declara que o tipo é aberto, o que permite campos não presentes na lista de especificações de campo.Including the openrecord-marker in the record type declares the type to be open, which permits fields not present in the field specification list. As duas expressões a seguir são equivalentes:The following two expressions are equivalent:

type record   // primitive type classifying all records 
type [ ... ]  // custom type classifying all records

Um valor obedecerá um tipo de registro se o valor for um registro e cada especificação de campo no tipo de registro for satisfeita.A value conforms to a record type if the value is a record and each field specification in the record type is satisfied. Uma especificação de campo será atendida se qualquer uma das seguintes opções for verdadeira:A field specification is satisfied if any of the following are true:

  • Um nome de campo correspondente ao identificador da especificação existe no registro e o valor associado obedece o tipo da especificaçãoA field name matching the specification's identifier exists in the record and the associated value conforms to the specification's type

  • A especificação é marcada como opcional e nenhum nome de campo correspondente é encontrado no registroThe specification is marked as optional and no corresponding field name is found in the record

Um valor compatível pode conter nomes de campo não listados na lista especificações de campo se, e somente se, o tipo de registro é aberto.A conforming value may contain field names not listed in the field specification list if and only if the record type is open.

Tipos de funçãoFunction Types

Qualquer valor de função obedece o tipo primitivo function, que não estabelece nenhuma restrição sobre os tipos dos parâmetros formais da função nem sobre o valor retornado da função.Any function value conforms to the primitive type function, which does not place any restrictions on the types of the function's formal parameters or the function's return value. Um valor de tipo-de-função personalizado é usado para estabelecer restrições de tipo sobre assinaturas dos valores de função compatíveis.A custom function-type value is used to place type restrictions on the signatures of conformant function values.

tipo-de-função:function-type:
      function ( lista-de-especificações-de-parâmetroopt ) tipo-retornado-da-função
lista-de-especificações-de-parâmetro:
      lista-de-especificações-de-parâmetro-obrigatórias
      lista-de-especificações-de-parâmetro-obrigatórias
, lista-de-especificações-de-parâmetro-opcionais
      lista-de-especificações-de-parâmetro-opcionais
lista-de-especificações-de-parâmetro-obrigatórias:
      especificação-de-parâmetro-obrigatória
      especificação-de-parâmetro-obrigatória
, lista-de-especificações-de-parâmetro-obrigatória
especificação-de-parâmetro-obrigatória:
      especificação-de-parâmetro
lista-de-especificações-de-parâmetro-obrigatórias:
      especificação-de-parâmetro-opcional
      especificação-de-parâmetro-opcional
, lista-de-especificações-de-parâmetro-opcionais
especificação-de-parâmetro-opcional:
      function ( parameter-specification-listopt ) function-return-type
parameter-specification-list:
      required-parameter-specification-list
      required-parameter-specification-list
, optional-parameter-specification-list
      optional-parameter-specification-list
required-parameter-specification-list:
      required-parameter-specification
      required-parameter-specification
, required-parameter-specification-list
required-parameter-specification:
      parameter-specification
optional-parameter-specification-list:
      optional-parameter-specification
      optional-parameter-specification
, optional-parameter-specification-list
optional-parameter-specification:

      optional especificação-de-parâmetro
especificação-de-parâmetro:
      nome-do-parâmetro tipo-de-parâmetro
tipo-retornado-da-função:
      asserção
asserção:
      optional parameter-specification
parameter-specification:
      parameter-name parameter-type
function-return-type:
      assertion
assertion:

      as tipo-primitivo-que-permite-valor-nulo      as nullable-primitive-type

O resultado da avaliação de um tipo-de-função é um valor de tipo cujo tipo base é function.The result of evaluating a function-type is a type value whose base type is function.

Os exemplos a seguir ilustram a sintaxe para declarar tipos de função:The following examples illustrate the syntax for declaring function types:

type function (x as text) as number 
type function (y as number, optional z as text) as any

Um valor de função obedece um tipo de função se o tipo retornado do valor da função é compatível com o tipo retornado do tipo de função e cada especificação de parâmetro do tipo de função é compatível com o parâmetro formal correspondente em termos de posição da função.A function value conforms to a function type if the return type of the function value is compatible with the function type's return type and each parameter specification of the function type is compatible to the positionally corresponding formal parameter of the function. Uma especificação de parâmetro é compatível com um parâmetro formal se o tipo-de-parâmetro especificado é compatível com o tipo do parâmetro formal e a especificação de parâmetro é opcional se o parâmetro formal é opcional.A parameter specification is compatible with a formal parameter if the specified parameter-type type is compatible with the type of the formal parameter and the parameter specification is optional if the formal parameter is optional.

Os nomes de parâmetro formais são ignorados para fins de determinação da conformidade do tipo de função.Formal parameter names are ignored for the purposes of determining function type conformance.

Tipos de tabelaTable types

Um valor de tipo-de-tabela é usado para definir a estrutura de um valor de tabela.A table-type value is used to define the structure of a table value.

tipo-de-tabela:table-type:
      table tipo-de-linha
tipo-de-linha:
      table row-type
row-type:

      [ lista-de-especificações-de-campo ]      [ field-specification-list ]

O resultado da avaliação de um tipo-de-tabela é um valor de tipo cujo tipo base é table.The result of evaluating a table-type is a type value whose base type is table.

O tipo de linha de uma tabela especifica os nomes de coluna e os tipos de coluna da tabela como um tipo de registro fechado.The row type of a table specifies the column names and column types of the table as a closed record type. Para que todos os valores de tabela obedeçam o tipo table, seu tipo de linha é tipo record (o tipo de registro aberto vazio).So that all table values conform to the type table, its row type is type record (the empty open record type). Portanto, o tipo de tabela é abstrato, uma vez que nenhum valor de tabela pode ter o tipo de linha do tipo table (mas todos os valores de tabela têm um tipo de linha compatível com o tipo de linha do tipo table).Thus, type table is abstract since no table value can have type table's row type (but all table values have a row type that is compatible with type table's row type). O exemplo a seguir mostra a construção de um tipo de tabela:The following example shows the construction of a table type:

type table [A = text, B = number, C = binary] 
// a table type with three columns named A, B, and C 
// of column types text, number, and binary, respectively

Um valor de tipo de tabela também contém a definição das chaves de um valor de tabela.A table-type value also carries the definition of a table value's keys. Uma chave é um conjunto de nomes de coluna.A key is a set of column names. No máximo uma chave pode ser designada como a chave primária da tabela.At most one key can be designated as the table's primary key. (Na linguagem M, as chaves de tabela não têm significado semântico.(Within M, table keys have no semantic meaning. No entanto, é comum que fontes de dados externas, como bancos de dados ou feeds OData, definam chaves em tabelas.However, it is common for external data sources, such as databases or OData feeds, to define keys over tables. O Power Query usa informações de chave para aprimorar o desempenho das funcionalidades avançadas, como operações de junção entre fontes.)Power Query uses key information to improve performance of advanced functionality, such as cross-source join operations.)

As funções de biblioteca padrão Type.TableKeys, Type.AddTableKey e Type.ReplaceTableKeys podem ser usadas para obter as chaves de um tipo de tabela, adicionar uma chave a um tipo de tabela e substituir todas as chaves de um tipo de tabela, respectivamente.The standard library functions Type.TableKeys, Type.AddTableKey, and Type.ReplaceTableKeys can be used to obtain the keys of a table type, add a key to a table type, and replace all keys of a table type, respectively.

Type.AddTableKey(tableType, {"A", "B"}, false) 
// add a non-primary key that combines values from columns A and B 
Type.ReplaceTableKeys(tableType, {}) 
// returns type value with all keys removed

Tipos anuláveisNullable types

Para qualquer type T, uma variante anulável pode ser derivada usando o tipo-anulável:For any type T, a nullable variant can be derived by using nullable-type:

tipo-anulável:nullable-type:
      nullable tipo      nullable type

O resultado é um tipo abstrato que permite valores do tipo T ou o valor null.The result is an abstract type that allows values of type T or the value null.

42 is nullable number             // true null is
nullable number                   // true

A atribuição de type nullable T reduz a atribuição type null ou type T. (Lembre-se de que os tipos anuláveis são abstratos e nenhum valor pode ter diretamente um tipo abstrato.)Ascription of type nullable T reduces to ascription of type null or type T. (Recall that nullable types are abstract and no value can be directly of abstract type.)

Value.Type(42 as nullable number)       // type number
Value.Type(null as nullable number)     // type null

As funções de biblioteca padrão Type.IsNullable e Type.NonNullable podem ser usadas para testar um tipo quanto à nulidade e remover a nulidade de um tipo.The standard library functions Type.IsNullable and Type.NonNullable can be used to test a type for nullability and to remove nullability from a type.

O seguinte é válido (para qualquer type T):The following hold (for any type T):

  • type T é compatível com type nullable Ttype T is compatible with type nullable T
  • Type.NonNullable(type T) é compatível com type TType.NonNullable(type T) is compatible with type T

Os seguintes são equivalentes emparelhados (para qualquer type T):The following are pairwise equivalent (for any type T):

    type nullable any
    any    any

    Type.NonNullable(type any)
    type anynonnull    type anynonnull

    type nullable none
    type null    type null

    Type.NonNullable(type null)
    type none    type none

    type nullable nullable T    type nullable nullable T
    type nullable T    type nullable T

    Type.NonNullable(Type.NonNullable(type T))    Type.NonNullable(Type.NonNullable(type T))
    Type.NonNullable(type T)    Type.NonNullable(type T)

    Type.NonNullable(type nullable T)    Type.NonNullable(type nullable T)
    Type.NonNullable(type T)    Type.NonNullable(type T)

    type nullable (Type.NonNullable(type T))    type nullable (Type.NonNullable(type T))
    type nullable T    type nullable T

Tipo atribuído de um valorAscribed type of a value

O tipo atribuído de um valor é o tipo a que é declarado que um valor obedece.A value's ascribed type is the type to which a value is declared to conform. Quando um tipo é atribuído a um valor, apenas uma verificação de conformidade limitada ocorre.When a value is ascribed a type, only a limited conformance check occurs. A linguagem M não executa verificações de conformidade além do tipo primitivo anulável. Os autores de programas em M que optam por atribuir aos valores definições de tipo mais complexas do que um tipo primitivo anulável devem garantir que esses valores obedeçam esses tipos.M does not perform conformance checking beyond a nullable primitive type. M program authors that choose to ascribe values with type definitions more complex than a nullable primitive-type must ensure that such values conform to these types.

É possível atribuir um tipo a um valor usando a função de biblioteca Value.ReplaceType.A value may be ascribed a type using the library function Value.ReplaceType. A função retorna um novo valor com o tipo atribuído ou gera um erro quando o novo tipo é incompatível com o tipo primitivo nativo do valor.The function either returns a new value with the type ascribed or raises an error if the new type is incompatible with the value's native primitive type. Em particular, a função gera um erro quando é feita uma tentativa de atribuir um tipo abstrato, como any.In particular, the function raises an error when an attempt is made to ascribe an abstract type, such as any.

As funções de biblioteca podem optar por computar e atribuir tipos complexos para a resultados com base nos tipos atribuídos dos valores de entrada.Library functions may choose to compute and ascribe complex types to results based on the ascribed types of the input values.

O tipo atribuído de um valor pode ser obtido usando a função de biblioteca Value.Type.The ascribed type of a value may be obtained using the library function Value.Type. Por exemplo:For example:

Value.Type( Value.ReplaceType( {1}, type {number} ) 
// type {number}

Equivalência e compatibilidade de tiposType equivalence and compatibility

A equivalência de tipos não é definida em M. Quaisquer dois valores de tipo comparados quanto à igualdade podem ou não retornar true.Type equivalence is not defined in M. Any two type values that are compared for equality may or may not return true. No entanto, a relação entre esses dois tipos (se true ou false) será sempre a mesma.However, the relation between those two types (whether true or false) will always be the same.

A compatibilidade entre um determinado tipo e um tipo primitivo anulável pode ser determinada usando a função de biblioteca Type.Is, que aceita um valor de tipo arbitrário como o primeiro e um valor de tipo primitivo anulável como o segundo argumento:Compatibility between a given type and a nullable primitive type can be determined using the library function Type.Is, which accepts an arbitrary type value as its first and a nullable primitive type value as its second argument:

Type.Is(type text, type nullable text)  // true 
Type.Is(type nullable text, type text)  // false 
Type.Is(type number, type text)         // false 
Type.Is(type [a=any], type record)      // true 
Type.Is(type [a=any], type list)        // false

Não há suporte em M para determinar a compatibilidade de um determinado tipo com um tipo personalizado.There is no support in M for determining compatibility of a given type with a custom type.

A biblioteca padrão inclui uma coleção de funções para extrair as características de definição de um tipo personalizado, de modo que testes de compatibilidade específicos podem ser implementados como expressões em M.The standard library does include a collection of functions to extract the defining characteristics from a custom type, so specific compatibility tests can be implemented as M expressions. Veja abaixo alguns exemplos; consulte a especificação da biblioteca de M para ver os detalhes completos.Below are some examples; consult the M library specification for full details.

Type.ListItem( type {number} ) 
  // type number 
Type.NonNullable( type nullable text ) 
  // type text 
Type.RecordFields( type [A=text, B=time] ) 
  // [ A = [Type = type text, Optional = false], 
  //   B = [Type = type time, Optional = false] ] 
Type.TableRow( type table [X=number, Y=date] ) 
  // type [X = number, Y = date] 
Type.FunctionParameters(
        type function (x as number, optional y as text) as number) 
  // [ x = type number, y = type nullable text ] 
Type.FunctionRequiredParameters(
        type function (x as number, optional y as text) as number) 
  // 1 
Type.FunctionReturn(
        type function (x as number, optional y as text) as number) 
  // type number