Power Query M 公式語言中的類型

Power Query M 公式語言是實用的表達資料混搭語言。 但確實有一些限制。 例如,類型系統沒有強式強制執行。 在某些情況下,需要更嚴格的驗證。 幸運的是,M 提供內建程式庫,可支援類型,讓驗證更強大。

開發人員應該徹底瞭解類型系統,以便以任何一般性來執行此作業。 而且,雖然Power Query M 語言規格會妥善說明類型系統,但還是會產生一些意外。 例如,驗證函式實例需要一種方式來比較類型的相容性。

藉由更仔細地探索 M 類型系統,可以厘清這些問題的許多問題,而開發人員將能夠製作所需的解決方案。

述詞 calculus 和貝氏集合理論的知識應該足以瞭解所使用的標記法。

預賽

(1) B := { true; false }
B 是布林值的典型集合

(2) N := { 有效的 M 識別碼 }
N 是 M 中所有有效名稱的集合。這會定義于其他地方。

(3) P := ⟨BT
P 是函式參數的集合。 每一個可能都是選擇性的,而且具有類型。 參數名稱無關。

(4) Pn := ⋃0≤i≤niPi
Pn 是 n 函式參數的所有已排序序列集合。

(5) P* := ⋃0≤i≤∞Pi
P * 是函式參數所有可能序列的集合,從長度 0 向上。

(6) F := ⟨BNT
F 是所有記錄欄位的集合。 每個欄位可能是選擇性的、具有名稱和類型。

(7) Fn := ∏0≤i≤nF
Fn 是 n 筆記錄欄位的集合。

(8) F* := ( ⋃0≤i≤∞Fi ) ∖ { F | ⟨b1n1t 1, t1⟩, ⟨b2n2, n2⟩ ∈, fn1 = n2 }
F * 是所有集合 (記錄欄位的任何長度) ,但多個欄位具有相同名稱的集合除外。

(9) C := ⟨NT
C 是資料表的資料行類型集合。 每個資料行都有名稱和類型。

(10) Cn ⊂ ⋃0≤i≤niC
Cn 是 n 個數據行類型之所有已排序序列的集合。

(11) C* := ( ⋃0≤i≤∞Ci ) ∖ { Cm | ⟨a, ⟨n1t1⟩⟩, ⟨b, ⟨n2t2⟩⟩ ∈ Cmn1 = n2 }
C * 是所有組合 (任何長度的資料行類型) ,但多個資料行具有相同名稱的組合除外。

M 類型

(12) TF := ⟨PP*
函式類型包含傳回型別,以及零個或多個函式參數的已排序清單。

(13) TL :=\T
清單類型是以指定類型表示, (稱為「專案類型」) 大括弧括住。 由於大括弧會用於金角, · \ 方括弧會用於本檔。

(14) TR := ⟨BF*
記錄類型具有旗標,指出其為「開啟」,以及零個或多個未排序的記錄欄位。

(15) TRo := ⟨trueF

(16) TR := ⟨falseF
TRo 和 TR 分別是開啟和關閉記錄類型的標記法快捷方式。

(17) T := C*
資料表類型是零個或多個資料行類型的排序序列,其中沒有名稱衝突。

(18) TP := { any; none; null; logical; number; time; date; datetime; datetime; datetime; duration; text; binary; type; list; table; function; anynonnull }
基本類型是這個 M 關鍵字清單中的一個。

(19) TN := { tn, u ∈ T | tn = u+null } = 可為 Null的 t
任何類型都可以使用 來標示為可為 Null 「nullable」 關鍵字。

(20) T := TFTL ∪ T RTTTPTN
所有 M 類型的集合都是這六組類型的聯集:
函式類型、清單類型、記錄類型、資料表類型、基本類型,以及可為 Null 的類型。

功能

必須定義一個函式: 不可為 NullTT
此函式會採用 類型,並傳回相等的類型,但不符合 Null 值。

身份

需要某些身分識別才能定義一些特殊案例,也可能有助於說明上述情況。

(21) 可為 Null 的任何 = 任何
(22) 可為 Null 的 anynonnull = any
(23) 可為 Null 的 null = null
(24) 可為 Null 的 none = null
(25) 可為 Null 的可為 null 的 tT = 可為 Null 的 t
(26) NonNullable (可為 null 的 tT) = NonNullable (t)
(27) NonNullable (any) = anynonnull

類型相容性

如其他地方所定義,只有在符合第一個類型的所有值也符合第二個類型時,M 類型才能與另一個 M 類型相容。

以下是定義不相依于一致性值的相容性關聯性,而且是以類型本身的屬性為基礎。 此關聯如本檔所定義,完全相當於原始語意定義。

「is compatible with」 relation : ≤ : BT × T
在下一節中,小寫 t 一律代表 M Type, 這是 T的元素。

Ф將代表F* 子集或C* 的子集。

(28 ) tt
此關聯性是自反的。

(29) t b ≤ tb ∧tbtcttc
此關聯是可轉移的。

(30) ≤ t ≤任何
M 類型會形成此關聯性上之 Lattice; none 是底部, 而任何 是頂端。

(31) tatbTN ∧ t a ≤ t a → NonNullable (ta) ≤ NonNullable (tb)
如果兩種類型相容,則 NonNullable 對等專案也相容。

(32) null ≤ tTN
基本類型 null 與所有可為 Null 的類型相容。

(33) tTN ≤ anynonnull
所有不可為 Null 的類型都與 anynonnull 相容。

(34) 不可為 null (t) ≤ t
NonNullible 類型與可為 Null 的對等專案相容。

(35) tTFt ≤ 函式
所有函式類型都與 函式相容。

(36) tTLt ≤ 清單
所有清單類型都與清單相容

(37) tTRt ≤ 記錄
所有記錄類型都與記錄相容

(38) tTt ≤ 資料表
所有資料表類型都與資料表相容

(39) tatbt a/tb
如果專案類型相容,清單類型會與另一個清單類型相容,反之亦然。

(40) taTF = ⟨ pap * ⟩, tbTF = ⟨ pbp * ⟩ ∧ p a ≤ pb → ≤ tb
如果傳回型別相容,則函式類型與另一個函式類型相容,而且參數清單相同。

(41) taTRotbTRtatb
開啟的記錄類型永遠不會與關閉的記錄類型相容。

(42) taTR = ⟨falsetbTRo = ⟨true⟩ →tatb
關閉的記錄類型與相同開啟的記錄類型相容。

(43) taTRo = ⟨true, (truen, any⟩) ⟩, tbTRo = ⟨true⟩ →tatb ∧ t bta
比較兩個開啟的記錄類型時,可能會忽略具有任何類型的選擇性欄位

(44) ta ∈ T R = ⟨b, (⟨β, nu⟩) ⟩ a, u a, ua, tbTR = ⟨b, ( (, ⟨βnub⟩) ⟩ ∧ u a ≤ u b → ≤tb
如果欄位的名稱和選擇性相同,且該欄位的類型相容,則只有一個欄位的兩個記錄類型相容。

(45) taTR = ⟨b, (ー, ⟨falsenu⟩) ⟩, tbTR = ⟨b, (Ф, ⟨truenu⟩) ⟩ → tatb
具有非選擇性欄位的記錄類型與記錄類型相同,但該欄位為選擇性。

(46) taTRo = ⟨true, (, ⟨bnu⟩) ⟩, tbTRo = ⟨true⟩ →tatb
開啟的記錄類型與另一個開啟的記錄類型相容,且欄位較少。

(47) taT T = ( (, ⟨i, ⟨nu a, ua⟩⟩) , tbT = ( ( (,i, ⟨nub⟩⟩) ∧ u b ≤ ub → t a ≤ tb
當該資料行的類型相容時,資料表類型與第二個數據表類型相容,但對於具有不同類型的一個資料行而言相同。

REFERENCES

Microsoft Corporation (2015 年 8 月)
Microsoft Power Query for Excel 公式語言規格 [PDF]
擷取自 https://msdn.microsoft.com/library/mt807488.aspx

Microsoft Corporation (n.d.)
Power Query M 函式參考 [網頁]
擷取自 https://msdn.microsoft.com/library/mt779182.aspx