Sdílet prostřednictvím


Typy v jazyce vzorců Power Query M

Jazyk vzorců Power Query M je užitečný a výrazný jazyk mashupu dat. Má ale určitá omezení. Například neexistuje silné vynucování systému typů. V některých případech je potřeba přísnější ověření. M naštěstí poskytuje integrovanou knihovnu s podporou typů, aby bylo možné silnější ověřování.

Vývojáři by měli důkladně porozumět systému typů, aby to mohli provést s jakoukoli generalitou. A zatímco specifikace jazyka Power Query M vysvětluje systém typů dobře, ponechá několik překvapení. Například ověření instancí funkcí vyžaduje způsob, jak porovnat typy z důvodu kompatibility.

Prozkoumáním systému typů M důkladněji je možné řadu těchto problémů objasnit a vývojáři budou moct vytvářet potřebná řešení.

Znalost predikátu kalkulu a naïvové teorie množiny by měla být adekvátní k pochopení použitého zápisu.

PŘEDBĚŽNÉ KROKY

(1) B := { true; false }
B je typická sada logických hodnot.

(2) N := { platné identifikátory M }
N je sada všech platných názvů v jazyce M. Toto je definováno jinde.

(3) P := ⟨B, T
P je sada parametrů funkce. Každý z nich je pravděpodobně volitelný a má typ. Názvy parametrů nejsou relevantní.

(4) Pn := ⋃0≤i≤ni, Pi⟩
Pn je sada všech seřazených sekvencí n parametrů funkce.

(5) P := ⋃0≤i≤∞P i*
P* je sada všech možných sekvencí parametrů funkce od délky 0 nahoru.

(6) F := ⟨B, N, T
F je sada všech polí záznamů. Každé pole je pravděpodobně volitelné, má název a typ.

(7) Fn := ∏0≤i≤n F
Fn je sada všech sad n polí záznamů.

(8) F := ( ⋃0≤i≤∞ Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ Fn 1 = n2 }*
F* je sada všech sad (libovolné délky) polí záznamů s výjimkou sad, u kterých má více polí stejný název.

(9) C := ⟨N,T
C je sada typů sloupců pro tabulky. Každý sloupec má název a typ.

(10) Cn ⊂ ⋃0≤i≤ni, C⟩
Cn je sada všech seřazených sekvencí n typů sloupců.

(11) C := ( ⋃0≤i≤∞ C i ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cmn 1 = n2 }*
C* je sada všech kombinací (libovolné délky) typů sloupců, s výjimkou těch, u kterých má více než jeden sloupec stejný název.

M TYPES

(12) TF := ⟨P, P⟩*
Typ funkce se skládá z návratového typu a seřazeného seznamu parametrů funkce nula nebo více.

(13) TL :=〖T〗
Typ seznamu je označen daným typem (označovaným jako "typ položky") zabaleným do složených závorek. Vzhledem k tomu, že složené závorky se používají v metalanguage, 〖 〗 hranaté závorky se používají v tomto dokumentu.

(14) TR := ⟨B, F⟩*
Typ záznamu má příznak označující, jestli je "otevřená", a pole s nulovým nebo více neuspořádaným záznamem.

(15) TRo := ⟨true, F⟩

(16) TR := ⟨false, F⟩
TRo a TR jsou notační zkratky pro otevřené a uzavřené typy záznamů.

(17) T T := C *
Typ tabulky je seřazená posloupnost typů sloupců s nulovou nebo více hodnotami, kde nejsou žádné kolize názvů.

(18) TP := { any; none; null; logical; number; time; datetime; datetimezone; duration; text; binary; type; list; record; table; function; anynonnull }
Primitivní typ je jeden z tohoto seznamu klíčových slov M.

(19) TN := { tn, u ∈ T | tn = u+null } = nullable t
Libovolný typ lze navíc označit jako nullable pomocí klíčového slova nullable .

(20) T := TF ∪ T LTRT T T TP ∪ T N
Sada všech typů M je sjednocení těchto šesti sad typů:
Typy funkcí, typy seznamů, typy záznamů, typy tabulek, primitivní typy a typy s možnou hodnotou Null.

FUNKCE

Je potřeba definovat jednu funkci: NonNullable: T ← T
Tato funkce přebírá typ a vrací typ, který je ekvivalentní s tím rozdílem, že neodpovídá hodnotě null.

IDENTITY

Některé identity jsou potřeba k definování některých zvláštních případů a mohou také pomoct s elucididou výše.

(21) Libovolná hodnota null = libovolná
(22) nullable anynonnull = any
(23) Nullable null = null
(24) Žádná s možnou hodnotou null = null
(25) nullable nullable tT = nullable t
(26) NonNullable(nullable tT) = NonNullable(t)
(27) NonNullable(any) = anynonnull

KOMPATIBILITA TYPŮ

Jak je definováno jinde, typ M je kompatibilní s jiným typem M, pokud a pouze pokud všechny hodnoty, které odpovídají prvnímu typu, odpovídají také druhému typu.

Zde je definován vztah kompatibility, který nezávisí na odpovídajících hodnotách a je založen na vlastnostech samotných typů. Předpokládá se, že tento vztah, jak je definován v tomto dokumentu, je zcela ekvivalentní původní sémantické definici.

Vztah "je kompatibilní s" : ≤ : BT × T
V následující části bude malá písmena t vždy představovat typ M, prvek T.

Φ bude představovat podmnožinu F* nebo C*.

(28) tt
Tento vztah je reflexní.

29) t a ≤ tb ∧ t b ≤ tc → tat c
Tento vztah je tranzitivní.

(30) žádné ≤ t ≤ žádné
Typy M tvoří mřížku nad tímto vztahem; žádné není dole a všechny jsou nahoře.

(31) ta, tb bTNt a ≤ t a → NonNullable(ta) ≤ NonNullable(t b)
Jsou-li kompatibilní dva typy, jsou také kompatibilní ekvivalenty NonNullable.

(32) hodnota null ≤ tT N
Primitivní typ null je kompatibilní se všemi typy s možnou hodnotou null.

(33) t ∉ T N ≤ anynonnull
Všechny nenulovatelné typy jsou kompatibilní s anynonnull.

(34) Nenulable(t) ≤ t
Typ NonNullible je kompatibilní s ekvivalentem s možnou hodnotou null.

(35) tTFt
Všechny typy funkcí jsou kompatibilní s funkcí.

(36) t ∈ T Lt ≤
Všechny typy seznamů jsou kompatibilní se seznamem .

(37) tT R → t ≤ záznam
Všechny typy záznamů jsou kompatibilní se záznamem .

(38) tT T t ≤ tabulka
Všechny typy tabulek jsou kompatibilní s tabulkou.

(39) t a ≤ tb ↔ 〖ta〗≤〖tb〗
Typ seznamu je kompatibilní s jiným typem seznamu, pokud jsou typy položek kompatibilní a naopak.

(40) taTF = ⟨ p a, p* ⟩, tb bTF = ⟨ pb, p* ⟩ ∧ papb → t a ≤ t b b
Typ funkce je kompatibilní s jiným typem funkce, pokud jsou návratové typy kompatibilní a seznamy parametrů jsou identické.

(41) taTRo, tb bTRtat b
Typ otevřeného záznamu není nikdy kompatibilní s uzavřeným typem záznamu.

(42) taTR• = ⟨false, Φ⟩, tb ∈ TRo = ⟨true, Φ⟩ → t at b
Uzavřený typ záznamu je kompatibilní s jiným identickým otevřeným typem záznamu.

(43) taTRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → t atb ∧ tbt a
Volitelné pole s typem může být při porovnávání dvou otevřených typů záznamů ignorováno.

(44) taTR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ u aub → tat b
Dva typy záznamů, které se liší pouze jedním polem, jsou kompatibilní, pokud je název a volitelnost pole stejné a typy uvedeného pole jsou kompatibilní.

(45) taTR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → t at b
Typ záznamu s nepovinným polem je kompatibilní s identickým typem záznamu, ale pro toto pole je volitelné.

(46) taTRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → t at b
Typ otevřeného záznamu je kompatibilní s jiným typem otevřeného záznamu s jedním menším polem.

(47) taTT = (Φ, ⟨i, ⟨n, ua⟩⟩), tb b ∈ T T = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ u aubtat b b
Typ tabulky je kompatibilní s druhým typem tabulky, který je shodný, ale pro jeden sloupec s odlišným typem, pokud jsou typy pro daný sloupec kompatibilní.

ODKAZY

Microsoft Corporation (srpen 2015)
Specifikace jazyka vzorců Aplikace Microsoft Power Query pro Excel [PDF]
Citováno z https://msdn.microsoft.com/library/mt807488.aspx

Microsoft Corporation (n.d.)
Referenční informace k funkcím Power Query M [webová stránka]
Citováno z https://msdn.microsoft.com/library/mt779182.aspx