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 := ⋃*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 := ( ⋃* Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ F ⋀ n 1n = 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 := ( ⋃* C i ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cm ⋀ = 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, * ⟩, tb b ∈ TF = ⟨ pb,* ⟩ ∧ 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 typemmůž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í.
Do you want to learn about table types in Business Central? In this module, you'll learn about the different functional table types and their specific characteristics, such as special fields, properties, and linked pages.