TipiTypes

Un valore tipo è un valore che classifica altri valori.A type value is a value that classifies other values. Si dice che un valore classificato in base a un tipo sia conforme a quel tipo.A value that is classified by a type is said to conform to that type. Il sistema di tipi del linguaggio M è costituito dai tipi seguenti:The M type system consists of the following kinds of types:

  • Tipi primitivi, che classificano i valori primitivi (binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type) e includono anche alcuni tipi astratti (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)

  • Tipi record, che classificano i valori record in base ai nomi dei campi e ai tipi di valoreRecord types, which classify record values based on field names and value types

  • Tipi elenco, che classificano gli elenchi usando un tipo di base a elemento singoloList types, which classify lists using a single item base type

  • Tipi funzione, che classificano i valori funzione in base ai rispettivi tipi di parametri e valori restituitiFunction types, which classify function values based on the types of their parameters and return values

  • Tipi tabella, che classificano i valori tabella in base ai nomi delle colonne, ai tipi di colonna e alle chiaviTable types, which classify table values based on column names, column types, and keys

  • Tipi nullable, che classificano il valore Null, oltre a tutti i valori classificati a partire da un tipo di baseNullable types, which classifies the value null in addition to all the values classified by a base type

  • Tipi "tipo", che classificano i valori costituiti da tipiType types, which classify values that are types

Il set di tipi primitivi include i tipi di valori primitivi e alcuni tipi astratti, tipi che non classificano in modo univoco alcun valore: 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. Tutti i valori funzione sono conformi al tipo astratto function, tutti i valori tabella al tipo astratto table, tutti i valori al tipo astratto any e nessun valore al tipo astratto 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. Un'espressione di tipo none deve generare un errore o non poter essere terminata perché non è stato possibile produrre alcun valore conforme al 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. I tipi primitivi function e table sono astratti perché, rispettivamente, nessuna funzione o tabella appartiene direttamente a questi tipi.Note that the primitive types function and table are abstract because no function or table is directly of those types, respectively. I tipi primitivi record e list non sono astratti perché rappresentano, rispettivamente, un record aperto senza campi definiti e un elenco di tipo any.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.

Tutti i tipi che non appartengono al set chiuso di tipi primitivi sono definiti collettivamente come tipi personalizzati.All types that are not members of the closed set of primitive types are collectively referred to as custom types. I tipi personalizzati possono essere scritti usando un'espressione type-expression:Custom types can be written using a type-expression:

type-expression:
      primary-expression
type-expression:
      primary-expression

      type primary-type
type:
      parenthesized-expression
      primary-type
primary-type:
      primitive-type
      record-type
      list-type
      function-type
      table-type
      nullable-type
primitive-type:
uno tra
      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

I nomi primitive-type sono parole chiave contestuali riconosciute solo in un contesto type.The primitive-type names are contextual keywords recognized only in a type context. L'uso di parentesi in un contesto type riconduce la grammatica a un contesto di espressioni regolari ed è quindi necessario usare la parola chiave type per tornare a un contesto type.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. Per richiamare una funzione in un contesto type, è possibile, ad esempio, usare le parentesi:For example, to invoke a function in a type context, parentheses can be used:

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

Le parentesi possono essere usate anche per accedere a una variabile il cui nome entra in conflitto con un nome primitive-type: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 ]}

Nell'esempio seguente viene definito un tipo che classifica un elenco di numeri:The following example defines a type that classifies a list of numbers:

type { number }

Analogamente, nell'esempio seguente viene definito un tipo personalizzato che classifica i record con campi obbligatori denominati X e Y, i cui valori sono numeri: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 ]

Il tipo attribuito di un valore viene ottenuto usando la funzione della libreria standard Value.Type, come illustrato negli esempi seguenti: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

L'operatore is consente di determinare se il tipo di un valore è compatibile con un tipo specificato, come illustrato negli esempi seguenti: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

L'operatore as verifica che il valore sia compatibile con il tipo specificato e, se non è compatibile, genera un errore.The as operator checks if the value is compatible with the given type, and raises an error if it is not. In caso contrario, restituisce il valore originale.Otherwise, it returns the original value.

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

Tenere presente che gli operatori is e as accettano solo tipi primitivi come operando destro.Note that the is and as operators only accept primitive types as their right operand. M non offre alcun modo per verificare la conformità dei valori a tipi personalizzati.M does not provide means to check values for conformance to custom types.

Un tipo X è compatibile con un tipo Y se e solo se tutti i valori conformi a X sono conformi anche a Y.A type X is compatible with a type Y if and only if all values that conform to X also conform to Y. Tutti i tipi sono compatibili con il tipo any e nessun tipo (ad eccezione di none) è compatibile con il tipo none.All types are compatible with type any and no types (but none itself) are compatible with type none. Il grafico seguente illustra la relazione di compatibilitàThe following graph shows the compatibility relation. (la compatibilità dei tipi è riflessiva e transitiva;(Type compatibility is reflexive and transitive. forma un reticolo con tipo any come valore superiore e tipo none come valore inferiore). I nomi dei tipi astratti vengono impostati in corsivo.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.

Compatibilità del tipo

Per i valori tipo vengono definiti gli operatori seguenti:The following operators are defined for type values:

OperatoreOperator RisultatoResult
x = y Uguale aEqual
x <> y Diverso daNot equal

Il tipo nativo dei valori tipo è il tipo intrinseco type.The native type of type values is the intrinsic type type.

Tipi primitiviPrimitive Types

Nel linguaggio M, i tipi formano una gerarchia non contigua con radice nel tipo any, ovvero il tipo che classifica tutti i valori.Types in the M language form a disjoint hierarchy rooted at type any, which is the type that classifies all values. Qualsiasi valore M è conforme esattamente a un sottotipo primitivo di any.Any M value conforms to exactly one primitive subtype of any. Di seguito è illustrato il set chiuso di tipi primitivi che derivano dal tipo any:The closed set of primitive types deriving from type any are as follows:

  • type null, che classifica il valore Null.type null, which classifies the null value.
  • type logical, che classifica i valori true e false.type logical, which classifies the values true and false.
  • type number, che classifica i valori numero.type number, which classifies number values.
  • type time, che classifica i valori ora.type time, which classifies time values.
  • type date, che classifica i valori data.type date, which classifies date values.
  • type datetime, che classifica i valori datetime.type datetime, which classifies datetime values.
  • type datetimezone, che classifica i valori datetimezone.type datetimezone, which classifies datetimezone values.
  • type duration, che classifica i valori durata.type duration, which classifies duration values.
  • type text, che classifica i valori testo.type text, which classifies text values.
  • type binary, che classifica i valori binari.type binary, which classifies binary values.
  • type type, che classifica i valori tipo.type type, which classifies type values.
  • type list, che classifica i valori elenco.type list, which classifies list values.
  • type record, che classifica i valori record.type record, which classifies record values.
  • type table, che classifica i valori tabella.type table, which classifies table values.
  • type function, che classifica i valori funzione.type function, which classifies function values.
  • type anynonnull, che classifica tutti i valori ad esclusione di Null.type anynonnull, which classifies all values excluding null. Il tipo intrinseco none non classifica alcun valore.The intrinsic type none classifies no values.

Tipo anyAny Type

Il tipo any è astratto, classifica tutti i valori in M e tutti i tipi disponibili in M sono compatibili con any.The type any is abstract, classifies all values in M, and all types in M are compatible with any. Le variabili di tipo any possono essere associate a tutti i valori possibili.Variables of type any can be bound to all possible values. Poiché any è astratto, ad esso non può essere attribuito alcun valore, ovvero nessun valore è direttamente di tipo any.Since any is abstract, it cannot be ascribed to values—that is, no value is directly of type any.

Tipi listList Types

Qualsiasi valore che rappresenta un elenco è conforme al tipo intrinseco list, che non prevede alcuna restrizione per gli elementi all'interno di un valore elenco.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.

list-type:list-type:
      { item-type }      { item-type }
item-type:
      type
item-type:
      type

Il risultato della valutazione di un list-type è un valore di tipo list il cui tipo base è list.The result of evaluating a list-type is a list type value whose base type is list.

Negli esempi seguenti viene illustrata la sintassi necessaria per la dichiarazione di tipi elenco omogenei: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

Un valore è conforme a un tipo elenco se costituisce un elenco in cui ogni elemento è conforme al tipo elemento del tipo elenco.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.

Il tipo elemento di un tipo elenco denota un'associazione: tutti gli elementi di un elenco conforme sono necessariamente conformi al tipo elemento.The item type of a list type indicates a bound: all items of a conforming list conform to the item type.

Tipi recordRecord Types

Qualsiasi valore che rappresenta un record è conforme al tipo intrinseco type, che non prevede alcuna restrizione per i valori o i nomi di campo all'interno di un valore record.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. Un valore record-type consente di limitare il set di nomi validi e i tipi di valori che possono essere associati a questi nomi.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.

record-type:record-type:
      [ open-record-marker ]      [ open-record-marker ]
      [ field-specification-list opt ]      [ field-specification-listopt ]
      [ field-specification-list , open-record-marker ]      [ field-specification-list , open-record-marker ]
field-specification-list:
      field-specification
      field-specification , field-specification-list
field-specification:
field-specification-list:
      field-specification
      field-specification , field-specification-list
field-specification:

      optionalopt field-name field-type-specification opt
field-type-specification:
      optionalopt field-name field-type-specificationopt
field-type-specification:

      = field-type
field-type:
      type
open-record-marker:
      = field-type
field-type:
      type
open-record-marker:

      ...      ...

Il risultato della valutazione di un record-type è un valore di tipo il cui tipo base è record.The result of evaluating a record-type is a type value whose base type is record.

Nell'esempio seguente viene illustrata la sintassi necessaria per la dichiarazione di tipi record: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, ... ]

I tipi record sono chiusi per impostazione predefinita, ovvero non è possibile presentare come valori conformi eventuali campi aggiuntivi non presenti in fieldspecification-list.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. L'inserimento del openrecord-marker nel tipo record dichiara che il tipo è aperto, ovvero sono consentiti campi non presenti nell'elenco delle specifiche dei campi.Including the openrecord-marker in the record type declares the type to be open, which permits fields not present in the field specification list. Le due espressioni seguenti sono equivalenti:The following two expressions are equivalent:

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

Un valore è conforme a un tipo record se il valore è un record e viene soddisfatta ogni specifica di campo nel tipo record.A value conforms to a record type if the value is a record and each field specification in the record type is satisfied. Una specifica di campo viene soddisfatta se si verifica una delle condizioni seguenti:A field specification is satisfied if any of the following are true:

  • Nel record è presente un nome di campo corrispondente all'identificatore della specifica e il valore associato è conforme al tipo di specificaA field name matching the specification's identifier exists in the record and the associated value conforms to the specification's type

  • La specifica è contrassegnata come facoltativa e nel record non viene trovato alcun nome di campo corrispondenteThe specification is marked as optional and no corresponding field name is found in the record

Un valore conforme può contenere nomi di campo non elencati nell'elenco di specifiche dei campi se e solo se il tipo record è aperto.A conforming value may contain field names not listed in the field specification list if and only if the record type is open.

Tipi functionFunction Types

Qualsiasi valore funzione è conforme al tipo primitivo function, che non applica alcuna restrizione ai tipi dei parametri formali della funzione o al valore restituito dalla funzione.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. Un valore function-type consente di inserire restrizioni di tipo nelle firme dei valori funzione conformi.A custom function-type value is used to place type restrictions on the signatures of conformant function values.

function-type:function-type:
      function ( parameter-specification-list opt ) 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:
      function ( parameter-specification-list opt ) 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 parameter-specification
parameter-specification:
      parameter-name parameter-type
function-return-type:
      assertion
assertion:
      optional parameter-specification
parameter-specification:
      parameter-name parameter-type
function-return-type:
      assertion
assertion:

      as nullable-primitive-type      as nullable-primitive-type

Il risultato della valutazione di un function-type è un valore di tipo il cui tipo base è function.The result of evaluating a function-type is a type value whose base type is function.

Nell'esempio seguente viene illustrata la sintassi necessaria per la dichiarazione di tipi funzione: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

Un valore funzione è conforme a un tipo funzione se il tipo restituito del valore funzione è compatibile con il tipo restituito del tipo funzione e ogni specifica di parametro del tipo funzione è compatibile con il parametro formale della funzione corrispondente a livello di posizione.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. Una specifica di parametro è compatibile con un parametro formale se il tipo parameter-type specificato è compatibile con il tipo del parametro formale ed è facoltativa se il parametro formale è facoltativo.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.

I nomi dei parametri formali vengono ignorati quando si tratta di determinare la conformità del tipo funzione.Formal parameter names are ignored for the purposes of determining function type conformance.

Tipi tableTable types

Un valore table-type consente di definire la struttura di un valore tabella.A table-type value is used to define the structure of a table value.

table-type:table-type:
      table row-type
row-type:
      table row-type
row-type:

      [ field-specification-list ]      [ field-specification-list ]

Il risultato della valutazione di un table-type è un valore di tipo il cui tipo base è table.The result of evaluating a table-type is a type value whose base type is table.

Il tipo row di una tabella specifica i nomi e i tipi di colonna della tabella come tipo record chiuso.The row type of a table specifies the column names and column types of the table as a closed record type. Tutti i valori della tabella sono conformi al tipo table solo se la riga è di tipo record (tipo record aperto vuoto).So that all table values conform to the type table, its row type is type record (the empty open record type). Il tipo tabella è quindi astratto perché nessun valore di tabella può avere una riga di tipo table (ma tutti i valori di tabella hanno un tipo di riga compatibile con il 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). Nell'esempio seguente viene illustrata la creazione di un tipo tabella: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

Un valore tipo-tabella contiene anche la definizione delle chiavi di un valore tabella.A table-type value also carries the definition of a table value's keys. Una chiave è un set di nomi di colonna.A key is a set of column names. Non è possibile designare più di una chiave come chiave primaria della tabella.At most one key can be designated as the table's primary key. Nel linguaggio M, le chiavi di tabella non hanno alcun significato semantico.(Within M, table keys have no semantic meaning. È tuttavia comune che in origini dati esterne, quali database o feed OData, siano state definite chiavi sulle tabelle.However, it is common for external data sources, such as databases or OData feeds, to define keys over tables. Power Query usa le informazioni delle chiavi per migliorare le prestazioni delle funzionalità avanzate, ad esempio le operazioni di join tra più origini.Power Query uses key information to improve performance of advanced functionality, such as cross-source join operations.)

Le funzioni Type.TableKeys, Type.AddTableKey e Type.ReplaceTableKeys della libreria standard consentono, rispettivamente, di ottenere le chiavi di un tipo tabella, di aggiungere una chiave a un tipo tabella e di sostituire tutte le chiavi di un tipo tabella.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

Tipi nullableNullable types

Per qualsiasi type T è possibile ricavare una variante nullable usando nullable-type:For any type T, a nullable variant can be derived by using nullable-type:

nullable-type:nullable-type:
      nullable tipo      nullable type

Il risultato è un tipo astratto che consente valori di tipo T o il valore 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

L'attribuzione del type nullable T si riduce all'attribuzione del type null o type T. Tenere presente che i tipi nullable sono astratti e nessun valore può essere direttamente di tipo astratto.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

Le funzioni della libreria standard Type.IsNullable e Type.NonNullable consentono di testare la capacità di un tipo di supportare valori Null e di rimuovere questo tipo di supporto.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.

Sono valide le considerazioni seguenti (per qualsiasi type T):The following hold (for any type T):

  • type T è compatibile con type nullable Ttype T is compatible with type nullable T
  • Type.NonNullable(type T) è compatibile con type TType.NonNullable(type T) is compatible with type T

Di seguito sono riportati gli equivalenti pairwise (per qualsiasi 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 attribuito di un valoreAscribed type of a value

Il tipo attribuito di un valore è il tipo a cui un valore viene dichiarato conforme.A value's ascribed type is the type to which a value is declared to conform. Quando a un valore viene attribuito un tipo, viene eseguito solo un controllo di conformità limitato.When a value is ascribed a type, only a limited conformance check occurs. M non esegue controlli di conformità se non ai tipi primitivi nullable. Gli autori del programma M che scelgono di attribuire ai valori definizioni di tipi più complessi rispetto a un tipo primitivo nullable devono assicurarsi che questi valori siano conformi a questi tipi.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.

È possibile attribuire un tipo a un valore usando la funzione di libreria Value.ReplaceType.A value may be ascribed a type using the library function Value.ReplaceType. Questa funzione restituisce un nuovo valore con il tipo ascritto o genera un errore se il nuovo tipo non è compatibile con il tipo primitivo nativo del valore.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. In particolare, la funzione genera un errore quando viene eseguito un tentativo di ascrivere un tipo astratto, ad esempio any.In particular, the function raises an error when an attempt is made to ascribe an abstract type, such as any.

Le funzioni di libreria possono scegliere di calcolare e attribuire tipi complessi ai risultati in base ai tipi attribuiti ai valori di input.Library functions may choose to compute and ascribe complex types to results based on the ascribed types of the input values.

Il tipo attribuito a un valore può essere ottenuto usando la funzione di libreria Value.Type.The ascribed type of a value may be obtained using the library function Value.Type. ad esempio:For example:

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

Compatibilità ed equivalenza del tipoType equivalence and compatibility

Nel linguaggio M non è definita l'equivalenza del tipo. Qualsiasi coppia di valori tipo di cui viene eseguito il confronto può restituire o meno true.Type equivalence is not defined in M. Any two type values that are compared for equality may or may not return true. La relazione tra questi due tipi (true o false), tuttavia, sarà sempre la stessa.However, the relation between those two types (whether true or false) will always be the same.

È possibile determinare la compatibilità tra un tipo specifico e un tipo primitivo nullable usando la funzione di libreria Type.Is, che accetta un valore di tipo arbitrario come primo argomento e un valore di tipo primitivo nullable come secondo argomento: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

In M non è possibile determinare la compatibilità di un tipo con un tipo personalizzato.There is no support in M for determining compatibility of a given type with a custom type.

La libreria standard include una raccolta di funzioni che consentono di estrarre le caratteristiche distintive di un tipo personalizzato e, pertanto, è possibile implementare test di compatibilità come espressioni 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. Di seguito sono riportati alcuni esempi. Per informazioni dettagliate, consultare la specifica della libreria M.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