Power Query M 公式語言中的類型
Power Query M 公式語言是實用的表達資料混搭語言。 但確實有一些限制。 例如,類型系統沒有強式強制執行。 在某些情況下,需要更嚴格的驗證。 幸運的是,M 提供內建程式庫,可支援類型,讓驗證更強大。
開發人員應該徹底瞭解類型系統,以便以任何一般性來執行此作業。 而且,雖然Power Query M 語言規格會妥善說明類型系統,但還是會產生一些意外。 例如,驗證函式實例需要一種方式來比較類型的相容性。
藉由更仔細地探索 M 類型系統,可以厘清這些問題的許多問題,而開發人員將能夠製作所需的解決方案。
述詞 calculus 和貝氏集合理論的知識應該足以瞭解所使用的標記法。
預賽
(1) B := { true; false }
B 是布林值的典型集合
(2) N := { 有效的 M 識別碼 }
N 是 M 中所有有效名稱的集合。這會定義于其他地方。
(3) P := ⟨B, T⟩
P 是函式參數的集合。 每一個可能都是選擇性的,而且具有類型。 參數名稱無關。
(4) Pn := ⋃0≤i≤n ⟨i, Pi⟩
Pn 是 n 函式參數的所有已排序序列集合。
(5) P* := ⋃0≤i≤∞Pi
P * 是函式參數所有可能序列的集合,從長度 0 向上。
(6) F := ⟨B、 N、 T⟩
F 是所有記錄欄位的集合。 每個欄位可能是選擇性的、具有名稱和類型。
(7) Fn := ∏0≤i≤nF
Fn 是 n 筆記錄欄位的集合。
(8) F* := ( ⋃0≤i≤∞Fi ) ∖ { F | ⟨b1, n1, t 1, t1⟩, ⟨b2, n2, n2⟩ ∈, f ⋀ n1 = n2 }
F * 是所有集合 (記錄欄位的任何長度) ,但多個欄位具有相同名稱的集合除外。
(9) C := ⟨N,T⟩
C 是資料表的資料行類型集合。 每個資料行都有名稱和類型。
(10) Cn ⊂ ⋃0≤i≤n ⟨i, C⟩
Cn 是 n 個數據行類型之所有已排序序列的集合。
(11) C* := ( ⋃0≤i≤∞Ci ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cm ⋀ n1 = n2 }
C * 是所有組合 (任何長度的資料行類型) ,但多個資料行具有相同名稱的組合除外。
M 類型
(12) TF := ⟨P, P* ⟩
函式類型包含傳回型別,以及零個或多個函式參數的已排序清單。
(13) TL :=\T≦
清單類型是以指定類型表示, (稱為「專案類型」) 大括弧括住。
由於大括弧會用於金角, · \ 方括弧會用於本檔。
(14) TR := ⟨B, F* ⟩
記錄類型具有旗標,指出其為「開啟」,以及零個或多個未排序的記錄欄位。
(15) TRo := ⟨true, F⟩
(16) TR• := ⟨false, F⟩
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 := TF ∪ TL ∪ T R ∪ TT ∪ TP ∪ TN
所有 M 類型的集合都是這六組類型的聯集:
函式類型、清單類型、記錄類型、資料表類型、基本類型,以及可為 Null 的類型。
功能
必須定義一個函式: 不可為 Null : T ← T
此函式會採用 類型,並傳回相等的類型,但不符合 Null 值。
身份
需要某些身分識別才能定義一些特殊案例,也可能有助於說明上述情況。
(21) 可為 Null 的任何 = 任何
(22) 可為 Null 的 anynonnull = any
(23) 可為 Null 的 null = null
(24) 可為 Null 的 none = null
(25) 可為 Null 的可為 null 的 t ∈ T = 可為 Null 的 t
(26) NonNullable (可為 null 的 t ∈ T) = NonNullable (t) (27) NonNullable (any) = anynonnull
類型相容性
如其他地方所定義,只有在符合第一個類型的所有值也符合第二個類型時,M 類型才能與另一個 M 類型相容。
以下是定義不相依于一致性值的相容性關聯性,而且是以類型本身的屬性為基礎。 此關聯如本檔所定義,完全相當於原始語意定義。
「is compatible with」 relation : ≤ : B ← T × T
在下一節中,小寫 t 一律代表 M Type, 這是 T的元素。
Ф將代表F* 子集或C* 的子集。
(28 ) t ≤ t
此關聯性是自反的。
(29) t b ≤ tb ∧tb ≤ tc → t ≤ tc
此關聯是可轉移的。
(30) ≤ t ≤任何
M 類型會形成此關聯性上之 Lattice; none 是底部, 而任何 是頂端。
(31) ta, tb ∈ TN ∧ t a ≤ t a → NonNullable (ta) ≤ NonNullable (tb)
如果兩種類型相容,則 NonNullable 對等專案也相容。
(32) null ≤ t ∈ TN
基本類型 null 與所有可為 Null 的類型相容。
(33) t ∉ TN ≤ anynonnull
所有不可為 Null 的類型都與 anynonnull 相容。
(34) 不可為 null (t) ≤ t
NonNullible 類型與可為 Null 的對等專案相容。
(35) t ∈ TF → t ≤ 函式
所有函式類型都與 函式相容。
(36) t ∈ TL → t ≤ 清單
所有清單類型都與清單相容 。
(37) t ∈ TR → t ≤ 記錄
所有記錄類型都與記錄相容 。
(38) t ∈ T → t ≤ 資料表
所有資料表類型都與資料表相容 。
(39) ta ≤ tb ↔ t a?≤/tb≦
如果專案類型相容,清單類型會與另一個清單類型相容,反之亦然。
(40) ta ∈ TF = ⟨ pa, p * ⟩, tb ∈ TF = ⟨ pb, p * ⟩ ∧ p a ≤ pb → ≤ tb
如果傳回型別相容,則函式類型與另一個函式類型相容,而且參數清單相同。
(41) ta ∈ TRo, tb ∈ TR• → ta ≰ tb
開啟的記錄類型永遠不會與關閉的記錄類型相容。
(42) ta ∈ TR• = ⟨false, ⟩, tb ∈ TRo = ⟨true, ⟩ →ta ≤ tb
關閉的記錄類型與相同開啟的記錄類型相容。
(43) ta ∈ TRo = ⟨true, (⟨true, n, any⟩) ⟩, tb ∈ TRo = ⟨true, ⟩ →ta ≤ tb ∧ t b ≤ ta
比較兩個開啟的記錄類型時,可能會忽略具有任何類型的選擇性欄位。
(44) ta ∈ T R = ⟨b, (⟨β, n, u⟩) ⟩ a, u a, ua, tb ∈TR = ⟨b, ( (, ⟨β, n, ub⟩) ⟩ ∧ u a ≤ u b → ≤tb
如果欄位的名稱和選擇性相同,且該欄位的類型相容,則只有一個欄位的兩個記錄類型相容。
(45) ta ∈ TR = ⟨b, (ー, ⟨false, n, u⟩) ⟩, tb ∈ TR = ⟨b, (Ф, ⟨true, n, u⟩) ⟩ → ta ≤ tb
具有非選擇性欄位的記錄類型與記錄類型相同,但該欄位為選擇性。
(46) ta ∈ TRo = ⟨true, (ー, ⟨b, n, u⟩) ⟩, tb ∈ TRo = ⟨true, ⟩ →ta ≤ tb
開啟的記錄類型與另一個開啟的記錄類型相容,且欄位較少。
(47) ta ∈ T T = ( (, ⟨i, ⟨n, u a, ua⟩⟩) , tb ∈ T = ( ( (, ⟨i, ⟨n, ub⟩⟩) ∧ 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