Types ในภาษาสูตร Power Query M
ภาษาสูตร Power Query M เป็นภาษาผสมข้อมูลที่มีประโยชน์และแสดงออก แต่มีข้อจํากัดบางอย่าง ตัวอย่างเช่น ไม่มีการบังคับใช้ระบบชนิดที่แข็งแกร่ง ในบางกรณี จําเป็นต้องตรวจสอบอย่างเข้มงวดมากขึ้น โชคดีที่ M มีไลบรารีที่มีอยู่ภายในพร้อมการสนับสนุนสําหรับชนิดต่าง ๆ เพื่อให้สามารถตรวจสอบความถูกต้องที่แข็งแกร่งยิ่งขึ้น
นักพัฒนาควรมีความเข้าใจอย่างละเอียดเกี่ยวกับประเภทระบบเพื่อทําเช่นนี้กับความทั่วไปใด ๆ และในขณะที่ข้อมูลจําเพาะของภาษา Power Query M อธิบายประเภทระบบได้ดี แต่ก็มีเรื่องน่าประหลาดใจบางอย่าง ตัวอย่างเช่น การตรวจสอบความถูกต้องของอินสแตนซ์ของฟังก์ชันจําเป็นต้องมีวิธีการเปรียบเทียบชนิดสําหรับความเข้ากันได้
โดยการสํารวจระบบประเภท M อย่างระมัดระวังมากขึ้น ปัญหาเหล่านี้จํานวนมากสามารถชี้แจงได้ และนักพัฒนาจะได้รับอํานาจในการสร้างโซลูชันที่พวกเขาต้องการ
ความรู้เกี่ยวกับเพรดิเคต calculus และ naïve ทฤษฎีชุดควรเพียงพอที่จะเข้าใจสัญพจน์ที่ใช้
ข้อมูลเบื้องต้น
(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≤∞P i*
P* คือชุดของลําดับที่เป็นไปได้ทั้งหมดของพารามิเตอร์ฟังก์ชัน ตั้งแต่ความยาว 0 ขึ้นไป
(6) F := ⟨B, N, T⟩
F คือชุดของเขตข้อมูลระเบียนทั้งหมด แต่ละเขตข้อมูลอาจเป็นตัวเลือก มีชื่อและชนิด
(7) Fn := ∏0≤i≤n F
Fn คือชุดของชุดเขตข้อมูลเรกคอร์ด n ทั้งหมด
(8) F := ( ⋃0≤i≤∞ Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ 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, t 2, t2⟩⟩ ∈ Cm ⋀ n1 = n2 }*
C* คือชุดของการรวมค่าทั้งหมด (ความยาวใดก็ตาม) ของชนิดคอลัมน์ ยกเว้นในกรณีที่มากกว่าหนึ่งคอลัมน์มีชื่อเดียวกัน
ชนิด M
(12) TF := ⟨P, P⟩*
ชนิดฟังก์ชันประกอบด้วยชนิดการส่งกลับและรายการตามลําดับของพารามิเตอร์ฟังก์ชัน zero-or-more
(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; ตรรกะ; ตัวเลข; เวลา; วันที่เวลา; datetimezone; duration; ข้อความ; ไบนารี; ชนิด; รายการ; เรกคอร์ด; ตาราง; ฟังก์ชัน anynonnull }
ชนิด Primitive คือหนึ่งจากรายการคําสําคัญ M นี้
(19) TN := { tn, u ∈ T | t n = u+null } = nullable t
นอกจากนี้ คุณสามารถทําเครื่องหมายชนิดใดๆ เป็น null ได้โดยใช้คําสําคัญ "nullable"
(20) T := TF ∪ TL ∪ TR ∪ T ∪ TP ∪ TN
ชุดของชนิด M ทั้งหมดคือการรวมกันของประเภทหกชุดนี้:
Function Types, List Types, Record Types, Table Types, Primitive Types และ Nullable Types
ฟังก์ชัน
จําเป็นต้องกําหนดฟังก์ชันหนึ่ง: NonNullable : T ← T
ฟังก์ชันนี้ใช้ชนิดและแสดงชนิดที่เทียบเท่า ยกเว้นว่าไม่สอดคล้องกับค่า null
ข้อมูลประจําตัว
ข้อมูลประจําตัวบางอย่างจําเป็นเพื่อกําหนดกรณีพิเศษบางอย่าง และอาจช่วยให้สามารถระบุข้อมูลข้างต้นได้
(21) nullable ใดๆ = any
(22) anynonnull nullable = any
(23) null ที่สามารถเป็น null ได้ = null
(24) ไม่มีค่าว่าง = null
(25) nullable nullable t ∈ T = nullable t
(26) NonNullable(nullable t ∈ T) = NonNullable(t)
(27) NonNullable(any) = anynonnull
ความเข้ากันได้ของชนิด
ตามที่กําหนดไว้ในที่อื่น ชนิด M สามารถใช้งานร่วมกับชนิด M ชนิดอื่นได้ หากและเฉพาะในกรณีที่ค่าทั้งหมดที่สอดคล้องกับชนิดแรกยังสอดคล้องกับชนิดที่สอง
ต่อไปนี้จะกําหนดความสัมพันธ์ของความเข้ากันได้ที่ไม่ขึ้นอยู่กับค่าที่สอดคล้องและขึ้นอยู่กับคุณสมบัติของชนิด ซึ่งคาดว่าความสัมพันธ์นี้ตามที่กําหนดไว้ในเอกสารนี้จะเทียบเท่ากับข้อกําหนดความหมายดั้งเดิมอย่างสมบูรณ์
ความสัมพันธ์ "เข้ากันได้กับ" : ≤ : B ← T × T
ในส่วนด้านล่าง ตัวพิมพ์เล็ก t จะแสดงถึงชนิด M ซึ่งเป็นองค์ประกอบของ T เสมอ
Φ จะแสดงชุดย่อยของ F* หรือ C *
(28) t ≤ t
ความสัมพันธ์นี้เป็นแบบสะท้อน
(29) ta ≤ tb ∧ tb ≤ tc → ta ≤ t c
ความสัมพันธ์นี้เป็นแบบส่งต่อ
(30) ไม่มี≤≤
ชนิด M จะสร้างแลตทิซเหนือความสัมพันธ์ นี้ ไม่มี เป็นด้านล่างและ ใด ๆ อยู่ด้านบน
(31) t, t ∈ TN ∧ t a ≤ t a → NonNullable(t) ≤ NonNullable(tb)
ถ้าสองชนิดเข้ากันได้ ค่าเทียบเท่า NonNullable จะเข้ากันได้เช่นกัน
(32) null ≤ t ∈ TN
null ชนิดแรกเริ่มเข้ากันได้กับชนิด null ทั้งหมด
(33) t ∉ TN ≤ anynonnull
ชนิดที่ไม่สามารถพูดได้ทั้งหมดเข้ากันได้กับ anynonnull
(34) NonNullable(t) ≤ t
ชนิดที่ไม่สามารถระบุได้เข้ากันได้กับค่าที่เทียบเท่า nullable
(35) t∈ฟังก์ชัน tF → t ≤
ชนิดฟังก์ชันทั้งหมดเข้ากันได้กับ ฟังก์ชัน
(36) t ∈ TL → t ≤ รายการ
ชนิดรายการทั้งหมดเข้ากันได้กับ รายการ
(37) t ∈ TR → ระเบียน≤
ชนิดระเบียนทั้งหมดเข้ากันได้กับ ระเบียน
(38) t ∈ T →ตาราง≤
ชนิดตารางทั้งหมดเข้ากันได้กับ ตาราง
(39) ta ≤ tb ↔ 〖ta〗≤〖tb〗
ชนิดรายการสามารถใช้ร่วมกับรายการชนิดอื่นได้ถ้าชนิดหน่วยข้อมูลสามารถเข้ากันได้ และในทางกลับกันด้วย
(40) t ∈ TF = ⟨ pa, p* ⟩, tb ∈ TF = ⟨ pb, p* ⟩ ∧ p ≤ pb → t a ≤ t b
ชนิดฟังก์ชันสามารถเข้ากันได้กับฟังก์ชันชนิดอื่นหากชนิดผลลัพธ์สามารถเข้ากันได้ และรายการพารามิเตอร์จะเหมือนกัน
(41) ta ∈ TRo, tb ∈ TR• → ta ≰ t b
ชนิดเรกคอร์ดแบบเปิดจะไม่เข้ากันกับชนิดของเรกคอร์ดแบบปิด
(42) ta ∈ TR• = ⟨false, Φ⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ t b
ชนิดเรกคอร์ดแบบปิดสามารถเข้ากันได้กับชนิดเรกคอร์ดเปิดที่เหมือนกันเป็นอย่างอื่น
(43) t a ∈ TRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tb ∈ TO = ⟨true, Φ⟩ → t≤ tb ∧ t ≤ t
เขตข้อมูลที่เลือกได้ด้วยชนิด ใดก็ตาม อาจถูกละเว้นเมื่อเปรียบเทียบชนิดเรกคอร์ดที่เปิดอยู่สองชนิด
(44) t a ∈ TR = ⟨b, (Φ, ⟨β, n, u a⟩)⟩, tb ∈ T = ⟨b, (Φ, ⟨β, n, n, ub⟩)⟩ ∧ u ≤ u → ≤ t
เรกคอร์ดสองชนิดที่แตกต่างกันโดยหนึ่งเขตข้อมูลเท่านั้นจะเข้ากันได้ถ้าชื่อและตัวเลือกของเขตข้อมูลเหมือนกัน และชนิดของเขตข้อมูลดังกล่าวสามารถเข้ากันได้กับ
(45) t∈ TR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tb ∈ T = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → t ≤ t b
ชนิดเรกคอร์ดที่มีเขตข้อมูลที่ไม่ใช่ตัวเลือกเข้ากันได้กับชนิดของเรกคอร์ดเหมือนกัน แต่สําหรับเขตข้อมูลนั้นที่เลือกได้
(46) ta ∈ TRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ t b
ชนิดเรกคอร์ดแบบเปิดเข้ากันได้กับเรกคอร์ดชนิดเปิดอื่นที่มีเขตข้อมูลน้อยลงหนึ่งรายการ
(47) ta ∈ T = (Φ, ⟨i, ⟨n, ua⟩⟩), tb ∈ T = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ u≤ u→ t ≤ t b
ชนิดตารางเข้ากันได้กับชนิดตารางที่สอง ซึ่งเหมือนกันแต่สําหรับหนึ่งคอลัมน์ที่มีชนิดแตกต่างกัน เมื่อชนิดของคอลัมน์นั้นสามารถเข้ากันได้กับ
การอ้างอิง
Microsoft Corporation (สิงหาคม 2015)
ข้อมูลจําเพาะของ Microsoft Power Query สําหรับ Excel Formula Language [PDF]
ดึงข้อมูลจาก https://msdn.microsoft.com/library/mt807488.aspx
Microsoft Corporation (n.d.)
การอ้างอิงฟังก์ชัน Power Query M [เว็บเพจ]
ดึงข้อมูลจาก https://msdn.microsoft.com/library/mt779182.aspx