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≤n ⟨i, 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⟩ ∈ F ⋀ n 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≤n ⟨i, 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⟩⟩ ∈ Cm ⋀ n 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 L ∪ TR ∪ T 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 t ∈ T = nullable t
(26) NonNullable(nullable t ∈ T) = 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" : ≤ : B ← T × 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) t ≤ t
Tento vztah je reflexní.
29) t a ≤ tb ∧ t b ≤ tc → ta ≤ t 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 b ∈ TN ∧ t a ≤ t a → NonNullable(ta) ≤ NonNullable(t b)
Jsou-li kompatibilní dva typy, jsou také kompatibilní ekvivalenty NonNullable.
(32) hodnota null ≤ t ∈ T 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) t ∈ TF → t ≤
Všechny typy funkcí jsou kompatibilní s funkcí.
(36) t ∈ T L → t ≤
Všechny typy seznamů jsou kompatibilní se seznamem .
(37) t ∈ T R → t ≤ záznam
Všechny typy záznamů jsou kompatibilní se záznamem .
(38) t ∈ T 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) ta ∈ TF = ⟨ p a, p* ⟩, tb b ∈ TF = ⟨ pb, p* ⟩ ∧ pa ≤ pb → 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) ta ∈ TRo, tb b ∈ TR• → ta ≰ t b
Typ otevřeného záznamu není nikdy kompatibilní s uzavřeným typem záznamu.
(42) ta ∈ TR• = ⟨false, Φ⟩, tb ∈ TRo = ⟨true, Φ⟩ → t a ≤ t b
Uzavřený typ záznamu je kompatibilní s jiným identickým otevřeným typem záznamu.
(43) ta ∈ TRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → t a ≤ tb ∧ tb ≤ t a
Volitelné pole s typem může být při porovnávání dvou otevřených typů záznamů ignorováno.
(44) ta ∈ TR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ u a ≤ ub → ta ≤ t 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) ta ∈ TR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → t a ≤ t b
Typ záznamu s nepovinným polem je kompatibilní s identickým typem záznamu, ale pro toto pole je volitelné.
(46) ta ∈ TRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → t a ≤ t 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) ta ∈ TT = (Φ, ⟨i, ⟨n, ua⟩⟩), tb b ∈ T T = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ u a ≤ ub → ta ≤ t 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