Typy v jazyku vzorcov Power Query M
Jazyk vzorcov Power Query M je užitočný a expresívny jazyk mashup údajov. Má však určité obmedzenia. Neexistuje napríklad silné vynútenie typu systému. V niektorých prípadoch je potrebné prísnejšie overovanie. Jazyk M našťastie poskytuje vstavanú knižnicu s podporou typov, aby bolo silnejšie overovanie uskutočniteľné.
Vývojári by mali dôkladne porozumieť systému typov, aby to bolo možné s akoukoľvek všeobecnosťou. A zatiaľ čo špecifikácia jazyka Power Query M dobre vysvetľuje systém typov, zanecháva to niekoľko prekvapení. Napríklad overenie inštancií funkcie vyžaduje spôsob porovnania typov na účely kompatibility.
Preskúmaním systému typov jazyka M dôkladne preskúmať mnohé z týchto problémov a vývojári budú môcť vytvárať riešenia, ktoré potrebujú.
Znalosti predikátového kalkulu a naivnej teórie množiny by mali byť adekvátne na pochopenie použitého zápisu.
PREDBEŽNÉ ÚDAJE
(1) B := { true; False }
B je typická množina booleovských hodnôt
(2) N := { platné identifikátory M }
N je množina všetkých platných názvov v jazyku M. Toto je definované inde.
(3) P := ⟨B, T⟩
P je množina parametrov funkcie. Každý z nich je pravdepodobne voliteľný a má typ. Názvy parametrov sú irelevantné.
(4) Pn := ⋃0≤i≤n ⟨i, Pi⟩
Pn je množina všetkých zoradených postupností parametrov funkcie n.
(5) P := ⋃*P i
P* je množina všetkých možných postupností parametrov funkcie, od dĺžky 0 po zap.
(6) F := ⟨B, N, T⟩
F je množina všetkých polí záznamov. Každé pole je pravdepodobne voliteľné, má názov a typ.
(7) Fn := ∏0≤i≤n F
Fn je množina všetkých množín n polí záznamov.
(8) F := ( ⋃* Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ F ⋀ n1n =
F* je množina všetkých množín (ľubovoľnej dĺžky) polí záznamov, s výnimkou množín, kde viac ako jedno pole má rovnaký názov.
(9) C := ⟨N,T⟩
C je množina typov stĺpcov pre tabuľky. Každý stĺpec má názov a typ.
C n ⊂ ⋃0≤i≤n ⟨i, C⟩
Cn je množina všetkých zoradených postupností n typov stĺpcov.
(11) C := ( ⋃* Ci ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cm ⋀ n1n = }
C* je množina všetkých kombinácií (ľubovoľnej dĺžky) typov stĺpcov, okrem tých, ktorých viac ako jeden stĺpec má rovnaký názov.
TYPY JAZYKA M
(12) TF := ⟨P, P⟩*
Typ funkcie sa skladá z typu návratu a zoradeného zoznamu parametrov funkcie nula alebo viac.
(13) T L :=〖T〗
Typ zoznamu je indikovaný daným typom (nazývaným "typ položky") zabalený v zložených zátvorkách.
Keďže v metalanguage sa používajú zložené zátvorky, 〖 V tomto dokumente sa používajú zátvorky 〗 .
(14) T R := ⟨B, F⟩*
Typ záznamu má príznak označujúci, či ide o "otvorené" a polia záznamov bez poradia alebo nuly.
(15) T Ro := ⟨true, F⟩
(16) TR• := ⟨false, F⟩
TRo a T R• sú notové skratky pre otvorené a uzavreté typy záznamov.
(17) T:= C *
Table Type (Typ tabuľky) je zoradená postupnosť typov stĺpcov s nulami alebo viacerými, v prípade ktorých sa nevy vyskytnú žiadne kolízie názvov.
(18) TP := { any; none; null; logical; number; time; datetime; datetimezone; duration; duration; text; binary; type; list; record; table; function; anynonnull }
Primitívny typ je jeden z tohto zoznamu kľúčových slov jazyka M.
(19) TN := { tn, u ∈ T | tn = u+null } = nullable t
Akýkoľvek typ možno okrem toho označiť ako nulovateľný pomocou kľúčového slova "nullable" .
(20) T := TF ∪ T L ∪ TR ∪ T ∪ T P ∪ T N
Množina všetkých typov jazyka M je zjednotenie týchto šiestich množín typov:
Typy funkcie, typy zoznamu, typy záznamov, typy tabuliek, primitívne typy a typy s povolenou hodnotou null.
FUNKCIE
Je potrebné definovať jednu funkciu: Nenulovateľné : T ← T
Táto funkcia vezme typ a vráti typ, ktorý je ekvivalentný, s tým rozdielom, že nie je v súlade s hodnotou null.
IDENTÍT
Niektoré identity sú potrebné na definovanie niektorých špeciálnych prípadov a môžu tiež pomôcť s vyššie uvedeným dátumom.
(21) povolená hodnota null any = any
(22) povolená hodnota null anynonnull = any
(23) povolená hodnota null = null
(24) nulovateľný žiadny = null
(25) Nulovateľná hodnota t ∈ T = nulovateľná hodnota t
(26) NonNullable(nullable t ∈ T) = NonNullable(t) (27)
NonNullable(any) = anynonnull
KOMPATIBILITA TYPOV
Ako je definované inde, typ M je kompatovateľný s iným typom M, vtedy a len vtedy, ak všetky hodnoty, ktoré zodpovedajú prvému typu, tiež zodpovedajú druhému typu.
Tu je definovaný vzťah kompatibility, ktorý nezávisí na zodpovedajúcich hodnotách a je založený na vlastnostiach samotných typov. Očakáva sa, že tento vzťah, ako je definovaný v tomto dokumente, je úplne ekvivalentný pôvodnej sémantickej definícii.
Vzťah "je kompatibilný s": ≤ : B ← T × T
V sekcii nižšie bude písmo s malými písmenami vždy predstavovať prvok T typu M.
A A bude predstavovať podmnožinu F alebo C*.*
(28) t ≤ t
Táto súvislosť je reflexívna.
(29) t ≤ t b ∧ t b ≤ t c → t ≤ t c
Tento vzťah je tranzitívny.
(30) žiadny ≤ ≤ žiadny
Typy M tvoria mriežku nad týmto vzťahom; žiadna nie je v dolnej časti a žiadna je na vrchu.
(31) ta, t b ∈ TN ∧ ta ≤ t a → NonNullable(t a) ≤ NonNullable(tb)
Ak sú dva typy kompatibilné, potom sú kompatibilné aj nenulovateľné ekvivalenty.
(32) hodnota null ≤ t ∈ TN
Primitívny typ null je kompatibilný so všetkými typmi s povolenou hodnotou null.
(33) t ∉ TN ≤ žiadne
Všetky typy, ktoré nie súnulovateľné, sú kompatibilné s akoukoľvek nenulovou platnosťou .
(34) Nenulovateľné(t) ≤ t
Nenulovateľný typ je kompatibilný s ekvivalentom s povolenou hodnotou null.
(35) funkcia ∈ TF → t ≤
Všetky typy funkcií sú kompatibilné s funkciou .
(36) t ∈ T L → t ≤ zoznam
Všetky typy zoznamov sú kompatibilné so zoznamom .
(37) t ∈ TR → t ≤ záznam
Všetky typy záznamov sú kompatibilné so záznamom .
(38) t ∈ T → t ≤ tabuľke
Všetky typy tabuliek sú kompatibilné s tabuľkou .
(39) t ≤ tb ↔ 〖ta〗≤〖tb〗
Typ zoznamu je kompatibilný s iným typom zoznamu, ak sú typy položiek kompatibilné a naopak.
(40) ta ∈ TF = ⟨ pa, p* ⟩, t b ∈ TF = ⟨ pb, * ⟩ ∧ pa ≤ pb → t a ≤ t b
Typ funkcie je kompatibilný s iným typom funkcie, ak sú vrátené typy kompatibilné a zoznamy parametrov sú identické.
t ∈ TRo, t b ∈ TR• → ta ≰ t b
Typ otvoreného záznamu nie je nikdy kompatibilný so uzavretým typom záznamu.
(42) t ∈ TR• = ⟨false, ⟩, tb ∈ TRo = ⟨true, ⟩ → t a ≤ t b
Uzavretý typ záznamu je kompatibilný s inak rovnakým typom otvoreného záznamu.
(43) t ∈ TRo = ⟨true, (⟨true, n, any⟩)⟩, tb ∈ TRo = ⟨true, V⟩ → t a ≤ tb ∧ tb ≤ t a
Voliteľné pole s typom any možno ignorovať pri porovnávaní dvoch otvorených typov záznamov.
(44) t a ∈ TR = ⟨b, (ß, ⟨β, n, u a⟩)⟩, tb ∈ TR = ⟨b, (Y, ⟨β, n, ub⟩)⟩ ∧ u a ≤ u b → t a ≤ t a ≤ t b b, b⟩)⟩ ∧ a u≤ ub → t a ≤ t
Dva typy záznamov, ktoré sa líšia iba jedným poľom, sú kompatibilné, ak sú názov a voliteľnosť poľa identické a typy uvedeného poľa sú kompatibilné.
(45) t a ∈ TR = ⟨b, (ß, ⟨false, n, u⟩)⟩, t b ∈ TR = ⟨b, (Μ, ⟨true, n, u⟩)⟩ → ta ≤ t b
Typ záznamu s nepovinným poľom je kompatibilný s rovnakým typom záznamu, ale pre toto pole je voliteľný.
(46) t a ∈ TRo = ⟨true, (ß, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, ⟩ → t a ≤ t b
Typ otvoreného záznamu je kompatibilný s iným typom otvoreného záznamu s jedným menším poľom.
(47) t a ∈ TT = (V, ⟨i, ⟨n, u a⟩⟩), tb ∈ T = (⟨i, ⟨n, ub⟩⟩) ∧ u a ≤ ub → ta ≤ t bb⟩⟩
Typ tabuľky je kompatibilný s druhým typom tabuľky, ktorý je rovnaký, ale pre jeden stĺpec s odlišným typom, keď sú typy pre tento stĺpec kompatibilné.