Türler

Tür değeri, diğer değerleri sınıflandırır. Bir tür tarafından sınıflandırılan bir değerin bu türe uygun olduğu söylenir. M türü sistemi aşağıdaki türlerden oluşur:

  • İlkel değerleri (binary, , , datetime, datetimezone, duration, , , list, logical, numbernulltimerecordtypetext, ) sınıflandıran ve ayrıca bir dizi soyut türü (function, table, anyanynonnull ve none) içeren ilkel türler date

  • Kayıt türlerini, alan adlarına ve değer türlerine göre kayıt değerlerini sınıflandıran

  • Tek bir öğe temel türü kullanarak listeleri sınıflandıran liste türleri

  • İşlev değerlerini parametrelerinin türlerine ve dönüş değerlerine göre sınıflandıran işlev türleri

  • Tablo değerlerini sütun adlarına, sütun türlerine ve anahtarlara göre sınıflandıran tablo türleri

  • Bir temel tür tarafından sınıflandırılan tüm değerlere ek olarak null değerini sınıflandıran null atanabilir türler

  • Tür olan değerleri sınıflandıran tür türleri

İlkel türler kümesi, ilkel değer türlerini ve herhangi bir değeri benzersiz olarak sınıflandırmayan bir dizi soyut türü içerir: function, table, anyanynonnull ve none. Tüm işlev değerleri soyut türüne function, tüm tablo değerleri soyut türüne, tüm değerler soyut türünetableany, null olmayan tüm değerler özet türüne ve soyut türüne anynonnullnonedeğer eklemez. türüne uygun nonebir değer üretilemediğinden, türünde none bir ifadenin hata vermesi veya sonlandırılamaması gerekir. İlkel türlerin function ve table soyut olduğunu unutmayın çünkü sırasıyla hiçbir işlev veya tablo doğrudan bu türlerden değildir. İlkel türler record ve list soyut değildir, çünkü bunlar sırasıyla tanımlı alanları olmayan açık bir kaydı ve herhangi bir türün listesini temsil ederler.

Kapalı ilkel tür kümesinin üyesi olmayan tüm türler ve bunların null atanabilir karşılıkları topluca özel türler olarak adlandırılır. Özel türler kullanılarak type-expressionyazılabilir:

tür-ifadesi:
      birincil ifade

      typebirincil tür
type:
      birincil ifade
      birincil tür
birincil tür:
      ilkel tür
      kayıt türü
      liste türü
      işlev türü
      tablo türü
      nullable-type
ilkel tür:
biri
      any anynonnull binary date datetime datetimezone duration function list logical
      none null number record table text time type

İlkel tür adları yalnızca bir tür bağlamında tanınan bağlamsal anahtar sözcüklerdir. Bir tür bağlamında ayraç kullanımı, dil bilgisini normal ifade bağlamlarına geri taşır ve tür bağlamı içine geri gitmek için tür anahtar sözcüğünü kullanmanız gerekir. Örneğin, bir işlevi tür bağlamında çağırmak için parantezler kullanılabilir:

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

Parantezler, adı ilkel tür adıyla çakşan bir değişkene erişmek için de kullanılabilir:

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

Aşağıdaki örnek, sayıların listesini sınıflandırır bir tür tanımlar:

type { number }

Benzer şekilde, aşağıdaki örnek, değerleri sayı olan ve Y adlı X zorunlu alanlara sahip kayıtları sınıflandırır özel bir tür tanımlar:

type [ X = number, Y = number ]

Bir değerin atfedilen türü, aşağıdaki örneklerde gösterildiği gibi Value.Type standart kitaplık işlevi kullanılarak elde edilir:

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

işleci is , aşağıdaki örneklerde gösterildiği gibi bir değerin türünün belirli bir türle uyumlu olup olmadığını belirlemek için kullanılır:

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

işleci as değerin verilen türle uyumlu olup olmadığını denetler ve değilse bir hata oluşturur. Aksi takdirde özgün değeri döndürür.

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

ve as işleçlerinin is yalnızca null atanabilir ilkel türleri sağ işlenen olarak kabul ettiğini unutmayın. M, değerlerin özel türlere uygun olup olmadığını denetlemek için bir araç sağlamaz.

X Türü, yalnızca ile uyumlu olan tüm değerlerin de ile uyumlu X olması durumunda bir türle Y uyumludurY. Tüm türler türle any uyumludur ve hiçbir tür (ancak none kendisi) türüyle noneuyumlu değildir. Aşağıdaki grafikte uyumluluk ilişkisi gösterilmektedir. (Tür uyumluluğu esnek ve geçişlidir. Türü en üstte, türü any de alt değer olarak olan none bir kafes oluşturur.) Soyut türlerin adları italik olarak ayarlanır.

Tür uyumluluğu

Tür değerleri için aşağıdaki işleçler tanımlanır:

Operatör Sonuç
x = y Equal
x <> y Not equal
x ?? y Coalesce

Tür değerlerinin yerel türü, iç türüdür type.

İlkel Türler

M dilindeki türler, tüm değerleri sınıflandıran tür olan türünde anykök köke sahip bir kopuk hiyerarşi oluşturur. Herhangi bir M değeri tam olarak bir ilkel alt türüne anyuygundur. Türünden türetilen kapalı ilkel tür any kümesi aşağıdaki gibidir:

  • type null, null değeri sınıflandırır.
  • type logical, true ve false değerlerini sınıflandırır.
  • type number, sayı değerlerini sınıflandırır.
  • type time, zaman değerlerini sınıflandırır.
  • type date, tarih değerlerini sınıflandırır.
  • type datetime, tarih saat değerlerini sınıflandırır.
  • type datetimezone, datetimezone değerlerini sınıflandırır.
  • type duration, süre değerlerini sınıflandırır.
  • type text, metin değerlerini sınıflandırır.
  • type binary, ikili değerleri sınıflandırır.
  • type type, tür değerlerini sınıflandırır.
  • type list, liste değerlerini sınıflandırır.
  • type record, kayıt değerlerini sınıflandırır.
  • type table, tablo değerlerini sınıflandırır.
  • type function, işlev değerlerini sınıflandırır.
  • type anynonnull, null hariç tüm değerleri sınıflandırır.
  • type none, hiçbir değeri sınıflandırmaz.

Herhangi Bir Tür

Tür any soyut, M'deki tüm değerleri sınıflandırır ve M'deki tüm türler ile anyuyumludur. Türün any değişkenleri tüm olası değerlere bağlanabilir. any Soyut olduğundan, değerlere atfedilemez; başka bir deyişle, hiçbir değer doğrudan türünde anydeğildir.

Liste Türleri

Liste olan herhangi bir değer, liste değeri içindeki öğelere herhangi bir kısıtlama yerleştirmeyen iç türüne listuygundur.

liste türü:
      { öğe türü }
öğe türü:
      tür

Liste türünü değerlendirmenin sonucu, temel türü olan bir liste türü değeridirlist.

Aşağıdaki örneklerde, homojen liste türlerini bildirmeye yönelik söz dizimi gösterilmektedir:

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

Değer bir listeyse ve bu liste değerindeki her öğe liste türünün öğe türüne uygunsa, bir değer liste türüne uygundur.

Liste türünün öğe türü, ilişkili olduğunu gösterir: uyumlu bir listenin tüm öğeleri öğe türüne uygundur.

Kayıt Türleri

Kayıt olan herhangi bir değer, kayıt değeri içindeki alan adlarına veya değerlerine herhangi bir kısıtlama yerleştirmeyen iç tür kaydına uygundur. Kayıt türü değeri, hem geçerli ad kümesini hem de bu adlarla ilişkilendirilmesine izin verilen değer türlerini kısıtlamak için kullanılır.

kayıt türü:
      [open-record-marker ]
      [ field-specification-listopt ]
      [ field-specification-list , open-record-marker ]
field-specification-list:
      alan belirtimi
      alan belirtimi , alan-belirtimi-listesi
alan belirtimi:

      optionalopt alan-adı alan-türü-belirtimiopt
alan türü belirtimi:

      =alan türü
alan türü:
      Tür
open-record-marker:

      ...

Kayıt türünü değerlendirmenin sonucu, temel türü olan bir tür değeridir record.

Aşağıdaki örneklerde kayıt türlerini bildirmeye yönelik söz dizimi gösterilmektedir:

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

Kayıt türleri varsayılan olarak kapatılır; başka bir deyişle fieldspecification-list içinde bulunmayan ek alanların uyumlu değerlerde bulunmasına izin verilmez. Kayıt türüne openrecord-marker'ın dahil edilmesi, türün açık olduğunu bildirir ve alan belirtimi listesinde bulunmayan alanlara izin verir. Aşağıdaki iki ifade eşdeğerdir:

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

Değer bir kayıt ise ve kayıt türündeki her alan belirtimi karşılanırsa, bir değer kayıt türüne uygundur. Aşağıdakilerden biri doğruysa alan belirtimi karşılanır:

  • Kayıtta belirtimin tanımlayıcısı ile eşleşen bir alan adı var ve ilişkili değer belirtimin türüne uygun

  • Belirtim isteğe bağlı olarak işaretlenir ve kayıtta karşılık gelen alan adı bulunmaz

Uyumlu bir değer, yalnızca kayıt türü açıksa ve açıksa alan belirtimi listesinde listelenmeyen alan adları içerebilir.

İşlev Türleri

Herhangi bir işlev değeri, işlevin resmi parametrelerinin türlerine veya işlevin dönüş değerine herhangi bir kısıtlama getirmeyecek ilkel türüne functionuygundur. Uyumlu işlev değerlerinin imzalarına tür kısıtlamaları getirmek için özel bir işlev türü değeri kullanılır.

işlev türü:
      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:
      parametre belirtimi
optional-parameter-specification-list:
      optional-parameter-specification
      optional-parameter-specification
, optional-parameter-specification-list
optional-parameter-specification:

      optionalparametre belirtimi
parametre belirtimi:
      parametre-adı parametre-türü
function-return-type:
      assertion
Iddia:

      as nullable-primitive-type

bir işlev türünü değerlendirmenin sonucu, temel türü olan bir tür değeridir function.

Aşağıdaki örneklerde işlev türlerini bildirmeye yönelik söz dizimi gösterilmektedir:

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

İşlev değerinin dönüş türü işlev türünün dönüş türüyle uyumluysa ve işlev türünün her parametre belirtimi işlevin konuma karşılık gelen resmi parametresiyle uyumluysa işlev değeri işlev türüne uygundur. Belirtilen parametre türü resmi parametre türüyle uyumluysa ve biçimsel parametre isteğe bağlıysa parametre belirtimi isteğe bağlıysa, parametre belirtimi resmi bir parametreyle uyumludur.

İşlev türü uyumluluğunun belirlenmesi amacıyla resmi parametre adları yoksayılır.

Bir parametrenin isteğe bağlı olarak örtük olarak belirtilmesi, türünü null atanabilir hale getirir. Aşağıdakiler aynı işlev türlerini oluşturur:

type function (optional x as text) as any
type function (optional x as nullable text) as any

Tablo türleri

Tablo türü değeri, tablo değerinin yapısını tanımlamak için kullanılır.

tablo türü:
      tablesatır türü
satır türü:

      [ field-specification-listopt ]

Tablo türünü değerlendirmenin sonucu, temel türü olan bir tür değeridir table.

Tablonun satır türü , tablonun sütun adlarını ve sütun türlerini kapalı kayıt türü olarak belirtir. Tüm tablo değerlerinin türüne tableuyması için, satır türü türdür record (boş açık kayıt türü). Bu nedenle, hiçbir tablo değerinin satır tabletürü olmadığından tablo türü soyut olur (ancak tüm tablo değerlerinin türüyle tableuyumlu bir satır türü vardır). Aşağıdaki örnekte tablo türünün yapısı gösterilmektedir:

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

Tablo türündeki bir değer, tablo değerinin anahtarlarının tanımını da taşır. Anahtar, sütun adları kümesidir. En fazla bir anahtar tablonun birincil anahtarı olarak belirlenebilir. (M içinde tablo tuşlarının anlamsal anlamı yoktur. Ancak, veritabanları veya OData akışları gibi dış veri kaynaklarının tablolar üzerinde anahtar tanımlaması yaygın bir durumdur. Power Query, kaynaklar arası birleştirme işlemleri gibi gelişmiş işlevlerin performansını geliştirmek için önemli bilgileri kullanır.)

Standart kitaplık işlevleri Type.TableKeys, Type.AddTableKeyve Type.ReplaceTableKeys bir tablo türünün anahtarlarını almak, tablo türüne anahtar eklemek ve sırasıyla bir tablo türünün tüm anahtarlarını değiştirmek için kullanılabilir.

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

Boş değer atanabilir tipler

Herhangi bir type Tiçin null atanabilir bir değişken null atanabilir tür kullanılarak türetilebilir:

null atanabilir tür:
      nullabletür

Sonuç, T türü veya değerine izin veren bir soyut türdürnull.

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

T'nin tanımlayıcısı type nullable veya type T'nin tanımlayıcısına type null indirgener. (Boş değer atanabilir türlerin soyut olduğunu ve hiçbir değerin doğrudan soyut türünde olmadığını hatırlayın.)

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

Standart kitaplık işlevleri Type.IsNullable ve Type.NonNullable bir türü null atanabilirlik için test etmek ve bir türden null atanabilirliği kaldırmak için kullanılabilir.

Aşağıdaki ayrı tutma (herhangi biri type Tiçin):

  • type T ile uyumludur type nullable T
  • Type.NonNullable(type T) ile uyumludur type T

Aşağıdakiler çift tabanlı eşdeğerdir (herhangi biri type Tiçin):

    type nullable any
    any

    Type.NonNullable(type any)
    type anynonnull

    type nullable none
    type null

    Type.NonNullable(type null)
    type none

    type nullable nullable T
    type nullable T

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

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

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

Değerin atfedilen türü

Değerin atfedilen türü, bir değerin uygun olarak bildirildiği türdür.

kitaplık işlevi Value.ReplaceTypekullanılarak bir değere tür atanabilir. Bu işlev, türü atfedilen yeni bir değer döndürür veya yeni tür değerle uyumsuzsa hata verir.

Bir değere tür atandığında, yalnızca sınırlı bir uyumluluk denetimi gerçekleşir:

  • Atfedilen tür soyut, null atanamaz ve değerin iç (yerel) ilkel türüyle uyumlu olmalıdır.
  • Yapıyı tanımlayan özel bir tür atfedildiğinde, değerin yapısıyla eşleşmesi gerekir.
    • Kayıtlar için: Türün kapatılması, değerle aynı sayıda alan tanımlaması ve isteğe bağlı alan içermemesi gerekir. (Türün alan adları ve alan türleri, şu anda kayıtla ilişkilendirilmiş olanların yerini alır. Ancak, var olan alan değerleri yeni alan türlerine karşı denetlenmeyecek.)
    • Tablolar için: Türün değerle aynı sayıda sütun tanımlaması gerekir. (Türün sütun adları ve sütun türleri, şu anda tabloyla ilişkilendirilmiş olanların yerini alır. Ancak, var olan sütun değerleri yeni sütun türlerine göre denetlenmeyecek.)
    • İşlevler için: Türün, değerle aynı sayıda gerekli parametrenin yanı sıra aynı sayıda isteğe bağlı parametre tanımlaması gerekir. (Türün parametresi ve dönüş onaylarının yanı sıra parametre adları, işlev değerinin geçerli türüyle ilişkili olanları değiştirir. Ancak, yeni onayların işlevin gerçek davranışı üzerinde hiçbir etkisi olmayacaktır.)
    • Listeler için: Değer bir liste olmalıdır. (Ancak, var olan liste öğeleri yeni öğe türüne göre denetlenmeyecek.)

Kitaplık işlevleri, giriş değerlerinin atfedilen türlerine göre karmaşık türleri hesaplamayı ve sonuçlara atamayı seçebilir.

Bir değerin atfedilen türü kitaplık işlevi Value.Typekullanılarak elde edilebilir. Örneğin:

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

Tür eşdeğerliği ve uyumluluk

Tür eşdeğerliği M'de tanımlanmamıştır. M uygulaması isteğe bağlı olarak kendi kurallarını kullanarak tür değerleri arasında eşitlik karşılaştırmaları yapmayı seçebilir. Eşitlik için iki tür değerinin karşılaştırılması, uygulama tarafından özdeş olarak kabul edilirse ve false aksi takdirde değerlendirilmelidirtrue. Her iki durumda da, aynı iki değer tekrar tekrar karşılaştırılırsa döndürülen yanıt tutarlı olmalıdır. Belirli bir uygulama içinde, bazı özdeş tür değerlerinin karşılaştırılması (örneğin(type text) = (type text)) döndürebilirken, diğerlerini karşılaştırmak (örneğin(type [a = text]) = (type [a = text])) döndürmeyebilirtrue.

Belirli bir tür ile null atanabilir ilkel tür arasındaki uyumluluk, ilk bağımsız değişkeni olarak rastgele bir tür değeri, ikinci bağımsız değişkeni olarak null atanabilir bir ilkel tür değeri kabul eden kitaplık işlevi Type.Iskullanılarak belirlenebilir:

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

M'de belirli bir türün özel bir türle uyumluluğunu belirleme desteği yoktur.

Standart kitaplık, belirli uyumluluk testlerinin M ifadeleri olarak uygulanabilmesi için özel bir türdeki tanımlama özelliklerini ayıklamak için bir işlev koleksiyonu içerir. Aşağıda bazı örnekler verilmiştir; tüm ayrıntılar için M kitaplığı belirtimine bakın.

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