Tipe dalam bahasa rumus Power Query M
Bahasa Rumus Power Query M adalah bahasa mashup data yang berguna dan ekspresif. Tapi itu memang memiliki beberapa batasan. Misalnya, tidak ada penegakan yang kuat dari sistem jenis. Dalam beberapa kasus, validasi yang lebih ketat diperlukan. Untungnya, M menyediakan pustaka bawaan dengan dukungan untuk jenis agar validasi yang lebih kuat layak.
Pengembang harus memiliki pemahaman menyeluruh tentang sistem jenis untuk melakukan ini dengan umumitas apa pun. Dan, sementara spesifikasi bahasa Power Query M menjelaskan sistem jenis dengan baik, itu meninggalkan beberapa kejutan. Misalnya, validasi instans fungsi memerlukan cara untuk membandingkan jenis kompatibilitas.
Dengan menjelajahi sistem jenis M dengan lebih hati-hati, banyak masalah ini dapat diklarifikasi, dan pengembang akan diberdayakan untuk membuat solusi yang mereka butuhkan.
Pengetahuan tentang kalkulus predikat dan teori set naif harus memadai untuk memahami notasi yang digunakan.
PRELIMINARIES
(1) B := { true; false }
B adalah kumpulan nilai Boolean yang khas
(2) N := { pengidentifikasi M yang valid }
N adalah kumpulan semua nama yang valid dalam M. Ini didefinisikan di tempat lain.
(3) P := ⟨B, T⟩
P adalah sekumpulan parameter fungsi. Masing-masing mungkin opsional, dan memiliki jenis. Nama parameter tidak relevan.
(4) Pn := ⋃0≤i≤n ⟨i, Pi⟩
Pn adalah kumpulan semua urutan parameter fungsi n yang diurutkan.
(5) P := ⋃*P i
P* adalah kumpulan semua urutan parameter fungsi yang mungkin, dari panjang 0 ke atas.
(6) F := ⟨B, N, T⟩
F adalah kumpulan semua bidang rekaman. Setiap bidang mungkin opsional, memiliki nama, dan jenis.
(7) Fn := ∏0≤i≤n F
Fn adalah kumpulan semua set bidang catatan n.
(8) F := ( ⋃* Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ F ⋀ n1n =
F* adalah kumpulan semua set (dengan panjang berapa pun) bidang rekaman, kecuali untuk set di mana lebih dari satu bidang memiliki nama yang sama.
(9) C := ⟨N,T⟩
C adalah kumpulan jenis kolom, untuk tabel. Setiap kolom memiliki nama dan jenis.
(10) Cn ⊂ ⋃0≤i≤n ⟨i, C⟩
Cn adalah kumpulan semua urutan yang diurutkan dari jenis kolom n.
(11) C := ( ⋃* Ci ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cm ⋀ n1n = }
C* adalah kumpulan semua kombinasi (dengan panjang berapa pun) jenis kolom, kecuali yang memiliki lebih dari satu kolom dengan nama yang sama.
JENIS M
(12) TF := ⟨P, P⟩*
Jenis Fungsi terdiri dari jenis pengembalian, dan daftar parameter fungsi nol atau lebih yang diurutkan.
(13) TL :=〖T〗
Jenis Daftar ditunjukkan oleh jenis tertentu (disebut "jenis item") yang dibungkus dengan kurung kurawal.
Karena kurung kurawal digunakan dalam metalanguage, 〖 〗 tanda kurung digunakan dalam dokumen ini.
(14) TR := ⟨B, F⟩*
Tipe Catatan memiliki bendera yang menunjukkan apakah itu "terbuka", dan bidang rekaman nol atau lebih yang tidak diurutkan.
(15) TRo := ⟨true, F⟩
(16) TR• := ⟨false, F⟩
TRo dan TR• adalah pintasan notasi untuk jenis rekaman terbuka dan tertutup.
(17) T := C *
Jenis Tabel adalah urutan yang diurutkan dari jenis kolom nol atau lebih, di mana tidak ada tabrakan nama.
(18) TP := { any; none; null; logical; number; time; date; datetime; datetimezone; duration; text; binary; type; list; record; table; function; anynonnull }
Jenis Primitif adalah salah satu dari daftar kata kunci M ini.
(19) TN := { tn, u ∈ T t | n = u+null } = nullable t
Jenis apa pun juga dapat ditandai sebagai nullable, dengan menggunakan kata kunci "nullable ".
(20) T := TF ∪ TL ∪ TR ∪ T T ∪ T P ∪ T N
Kumpulan semua jenis M adalah penyatuan dari enam set jenis ini:
Tipe Fungsi, Tipe Daftar, Tipe Rekaman, Tipe Tabel, Jenis Primitif, dan Tipe Nullable.
FUNCTIONS
Satu fungsi perlu didefinisikan: NonNullable : T ← T
Fungsi ini mengambil jenis, dan mengembalikan jenis yang setara kecuali tidak sesuai dengan nilai null.
IDENTITAS
Beberapa identitas diperlukan untuk menentukan beberapa kasus khusus, dan juga dapat membantu mendidik hal di atas.
(21) dapat diubah ke null apa pun = apa pun
(22) anynonnull nullable = any
(23) nullable = null
(24) tidak ada yang dapat diubah ke null = null
(25) nullable t ∈ T = nullable t
(26) NonNullable(nullable t ∈ T) = NonNullable(t)
(27) NonNullable(any) = anynonnull
KOMPATIBILITAS JENIS
Seperti yang didefinisikan di tempat lain, jenis M dapat dikompabilitas dengan jenis M lain jika dan hanya jika semua nilai yang sesuai dengan jenis pertama juga sesuai dengan jenis kedua.
Berikut didefinisikan hubungan kompatibilitas yang tidak bergantung pada nilai yang sesuai, dan didasarkan pada properti jenis itu sendiri. Diantisipasi bahwa hubungan ini, seperti yang didefinisikan dalam dokumen ini, sepenuhnya setara dengan definisi semantik asli.
Hubungan "kompatibel dengan" : ≤ : B ← T × T
Di bagian di bawah ini, huruf kecil t akan selalu mewakili Jenis M, elemen T.
Φ akan mewakili subset F, atau C*.*
(28) t ≤ t
Hubungan ini refleksif.
(29) t ≤ tb ∧ tb ≤ tc → t≤ t c
Hubungan ini transitif.
(30) tidak ada ≤ yang tidak ≤
Jenis M membentuk kisi atas hubungan ini; tidak ada yang bawah, dan apa pun adalah atas.
(31) t a, tb ∈ TN ∧ t ≤ t → NonNullable(ta) ≤ NonNullable(tb)
Jika dua jenis kompatibel, maka setara NonNullable juga kompatibel.
(32) ≤ null t ∈ TN
Jenis primitif null kompatibel dengan semua jenis nullable.
(33) t ∉ TN ≤ anynonnull
Semua jenis yang tidak dapat diulang kompatibel dengan anynonnull.
(34) NonNullable(t) ≤ t
Jenis NonNullible kompatibel dengan yang setara dengan nullable.
(35) fungsi ∈ TF → t ≤
Semua jenis fungsi kompatibel dengan fungsi.
(36) t ∈ TL → t daftar ≤
Semua tipe daftar kompatibel dengan daftar.
(37) catatan ∈ TR → t ≤
Semua jenis rekaman kompatibel dengan rekaman.
(38) t ∈ TT → tabel ≤
Semua jenis tabel kompatibel dengan tabel.
(39) t ≤ tb ↔ 〖a〗≤〖tb〗
Tipe daftar dapat dikompabilitas dengan tipe daftar lain jika tipe item kompatibel, dan sebaliknya.
(40) ta ∈ TF = ⟨ pa, * ⟩, tb ∈ TF = ⟨ pb, * ⟩ ∧ pa ≤ pb → ta ≤ t b
Jenis fungsi kompatibel dengan jenis fungsi lain jika jenis pengembalian kompatibel, dan daftar parameternya identik.
(41) t ∈ TRo, tb ∈ TR• → t a ≰ t b
Tipe rekaman terbuka tidak pernah kompatibel dengan tipe catatan tertutup.
(42) t ∈ TR• = ⟨false, Φ⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ t b
Jenis rekaman tertutup kompatibel dengan jenis rekaman terbuka yang identik.
(43) t ∈ TRo = ⟨true, (Φ, ⟨true, n, apa⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → t≤ tb ∧ tb ≤ t a
Bidang opsional dengan jenis apa pun dapat diabaikan saat membandingkan dua jenis rekaman terbuka.
(44) t ∈ TR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ ua ≤ ub → ta ≤ t b
Dua jenis rekaman yang hanya berbeda dengan satu bidang kompatibel jika nama dan opsionalitas bidang identik, dan jenis bidang tersebut kompatibel.
(45) t ∈ TR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → ta ≤ t b
Tipe catatan dengan bidang non-opsional kompatibel dengan tipe rekaman yang identik tetapi untuk bidang tersebut bersifat opsional.
(46) t ∈ TRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ t b
Jenis rekaman terbuka kompatibel dengan jenis rekaman terbuka lainnya dengan satu bidang yang lebih sedikit.
(47) t T T ∈ = (Φ, ⟨i, ⟨n, ua⟩⟩), tb ∈ TT = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ ua ≤ ub → ta ≤ t b
Jenis tabel kompatibel dengan jenis tabel kedua, yang identik tetapi untuk satu kolom memiliki jenis yang berbeda, ketika jenis untuk kolom tersebut kompatibel.
Konten terkait
- Spesifikasi Bahasa Power Query M
- referensi fungsi Power Query M
- Jenis dan Konversi Tipe
- Jenis