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
,number
null
time
record
type
text
, ) sınıflandıran ve ayrıca bir dizi soyut türü (function
,table
,any
anynonnull
venone
) içeren ilkel türlerdate
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
, any
anynonnull
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ünetable
any
, null olmayan tüm değerler özet türüne ve soyut türüne anynonnull
none
değer eklemez. türüne uygun none
bir 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-expression
yazılabilir:
tür-ifadesi:
birincil ifade
type
birincil 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 none
uyumlu 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 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 any
kök köke sahip bir kopuk hiyerarşi oluşturur. Herhangi bir M değeri tam olarak bir ilkel alt türüne any
uygundur. 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 any
uyumludur. 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 any
değ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 list
uygundur.
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:
optional
opt 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 function
uygundur. 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:
optional
parametre 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ü:
table
satı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 table
uyması 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 table
türü olmadığından tablo türü soyut olur (ancak tüm tablo değerlerinin türüyle table
uyumlu 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.AddTableKey
ve 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 T
için null atanabilir bir değişken null atanabilir tür kullanılarak türetilebilir:
null atanabilir tür:
nullable
tü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 T
için):
type T
ile uyumludurtype nullable T
Type.NonNullable(type T)
ile uyumludurtype T
Aşağıdakiler çift tabanlı eşdeğerdir (herhangi biri type T
iç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.ReplaceType
kullanı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.Type
kullanı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.Is
kullanı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