ควรอ่านสัญกรณ์ของระบบชนิดข้อมูลอย่างไร?
(langdev.stackexchange.com)- แม้สัญกรณ์ของระบบชนิดข้อมูลจะแตกต่างกันไปตามเอกสาร แต่ถ้าเข้าใจกรอบร่วมอย่าง ไวยากรณ์, ความสัมพันธ์การกำหนดชนิด, และกฎอนุมาน ก็จะตามรูปแบบส่วนใหญ่ได้
- ระบบชนิดข้อมูลทำงานบน ไวยากรณ์เชิงนามธรรม ของภาษา ดังนั้นก่อนอื่นต้องแยกพจน์ (term) ที่มีชนิดออกจากตัวชนิดเองด้วยไวยากรณ์
⊢ e: τคือ การตัดสินการกำหนดชนิด ที่หมายความว่า “นิพจน์eมีชนิดτ” และให้อ่านกฎอนุมานว่า หากเงื่อนไขทั้งหมดเหนือเส้นแนวนอนเป็นจริง ข้อสรุปด้านล่างก็เป็นจริงด้วย- เมื่อมีตัวแปรและฟังก์ชันเข้ามา จะมี บริบท แนบมาเช่น
Γ ⊢ e: τเพื่อคอยติดตามชื่อตัวแปรและชนิดในสโคปปัจจุบัน - กฎการกำหนดชนิดจำนวนมากอ่านได้เหมือนฟังก์ชันตรวจสอบชนิดแบบเรียกซ้ำ แต่ไม่ใช่ทุกการตัดสินเชิงตรรกะที่จะกลายเป็น อัลกอริทึม ตรวจสอบชนิดที่ตัดสินได้โดยตรง
สัญกรณ์ระบบชนิดข้อมูลที่เริ่มจากไวยากรณ์
- ระบบชนิดข้อมูลเป็น ระบบเชิงไวยากรณ์ ของภาษาโปรแกรม และเป็นชุดกฎที่ทำงานกับไวยากรณ์เชิงนามธรรมของภาษา
- คำอธิบายระบบชนิดข้อมูลแบบครอบคลุมมักนำเสนอโครงสร้างไวยากรณ์ที่กล่าวถึงด้วย ไวยากรณ์ ก่อน แล้วเขียนด้วยสัญกรณ์ BNF
- แม้ในภาษาชนิดข้อมูลที่ง่ายที่สุด ไวยากรณ์ก็แบ่งได้เป็นสองหมวดใหญ่
e: นิพจน์ (expression) ที่มีชนิดτ: ชนิด (type) ที่แนบกับนิพจน์
- ภาษาตัวอย่างมีลิเทอรัลบูลีน ลิเทอรัลจำนวนเต็ม นิพจน์เงื่อนไข การดำเนินการเลขคณิต และการเปรียบเทียบเป็นนิพจน์ และใช้
BoolกับIntเป็นชนิด - สัญลักษณ์ชนิดอาจเขียนเป็น
t,T,σหรืออักษรกรีกตัวพิมพ์เล็กอื่น ๆ แทนτได้ ขึ้นอยู่กับเอกสาร แต่โครงสร้างโดยรวมคล้ายกัน - ภาษาที่ซับซ้อนกว่านี้อาจมีหมวดไวยากรณ์เพิ่มขึ้น เช่น คำสั่ง หรือแพตเทิร์นของ pattern matching
การอ่านความสัมพันธ์และการตัดสินการกำหนดชนิด
- หลังจากกำหนดไวยากรณ์แล้ว โดยทั่วไปจะนิยาม ความสัมพันธ์การกำหนดชนิด ในรูป
e : τ1 + 2 : Intหมายความว่า “1 + 2มีชนิดInt”1 + 2 : Boolหมายความว่านิพจน์เดียวกันมีชนิดBoolซึ่งจึงไม่ถูกต้องtrue + 2 : Intเป็นนิพจน์ที่ตัวมันเองไม่สมเหตุสมผล จึงไม่มีชนิดใด
⊢ e : τคือ การตัดสินการกำหนดชนิด และ⊢อ่านได้ว่า “ประโยคด้านหลังเป็นจริง”- กฎที่ไม่มีอะไรอยู่เหนือเส้นแนวนอนคือ สัจพจน์ (axiom) ที่เป็นจริงเสมอ
⊢ true : Bool⊢ false : Bool- กฎลิเทอรัลจำนวนเต็ม เช่น
⊢ 0 : Int,⊢ 1 : Int,⊢ -1 : Int
- กฎที่มีทั้งด้านบนและด้านล่างของเส้นแนวนอนคือ กฎอนุมาน
- หากเงื่อนไขด้านบนทั้งหมดเป็นจริง ข้อสรุปด้านล่างก็เป็นจริง
- ถ้า
e₁และe₂เป็นIntทั้งคู่e₁ + e₂จะเป็นInt - ถ้า
e₁และe₂เป็นIntทั้งคู่e₁ < e₂จะเป็นBool
นิพจน์เงื่อนไขและตัวแปรชนิด
- สองกิ่งของ
if ... then ... else ...จะเป็นชนิดใดก็ได้ แต่ต้องเป็นชนิดเดียวกันif true then 1 else 2ทำได้if true then false else trueทำได้if true then 1 else trueทำไม่ได้
- เพื่อแสดงสิ่งนี้ กฎจึงใช้ตัวแปร
τแทนชนิดของกิ่ง- นิพจน์เงื่อนไข
e₁ต้องเป็นBool - กิ่ง
thenคือe₂และกิ่งelseคือe₃ต้องมีชนิดτเดียวกัน - ชนิดของนิพจน์เงื่อนไขทั้งหมดก็เป็น
τด้วย
- นิพจน์เงื่อนไข
- เมื่อใช้กฎ สามารถเลือกชนิดใดก็ได้ให้เป็น
τแต่ภายในกฎเดียวกันต้องรักษาการเลือกนั้นให้สอดคล้องกัน
อ่านกฎอนุมานเหมือนอัลกอริทึม
- สัญกรณ์นี้มาจากตรรกะเชิงรูปนัย และวิธีระบุระบบชนิดข้อมูลมีลักษณะคล้าย natural deduction เป็นพิเศษ
- กฎลักษณะนี้ใช้สร้างพิสูจน์เชิงรูปนัยเกี่ยวกับคุณสมบัติของระบบ และสำคัญต่อการพิสูจน์คุณสมบัติอย่าง type safety
- การตัดสินเชิงตรรกะไม่ได้สอดคล้องกับอัลกอริทึมตรวจสอบชนิดที่ตัดสินได้โดยตรงเสมอไป
- ในหลายกรณี สามารถอ่าน
⊢ e : τเหมือน ฟังก์ชัน ที่รับนิพจน์eแล้วได้ชนิดτ- โดยทั่วไปแต่ละรูปแบบของนิพจน์ในไวยากรณ์จะมีกฎหนึ่งกฎ
- กฎการกำหนดชนิดแต่ละข้อสามารถมองเป็นแขนงหนึ่งของฟังก์ชันตรวจสอบชนิดแบบเรียกซ้ำได้
- ฟังก์ชัน
inferในตัวอย่างสอดคล้องกับลำดับต่อไปนี้trueหรือfalseเป็นBool- ลิเทอรัลจำนวนเต็มเป็น
Int e₁ + e₂ตรวจสอบก่อนว่าผลอนุมานของทั้งสองฝั่งเป็นIntทั้งคู่ แล้วจึงให้เป็นInte₁ < e₂ตรวจสอบก่อนว่าทั้งสองฝั่งเป็นIntทั้งคู่ แล้วจึงให้เป็นBoolif e₁ then e₂ else e₃ตรวจสอบว่าเงื่อนไขเป็นBoolและตรวจสอบว่าสองกิ่งมีชนิดเดียวกัน แล้วคืนชนิดนั้น
- แม้จะย้ายไปเป็นอัลกอริทึมโดยตรงไม่ได้ แต่ถ้าคิดว่าใน judgment นั้น
eเป็นอินพุต และτเป็นเอาต์พุต ก็จะเข้าใจการไหลของข้อมูลได้ง่ายขึ้น
ตัวแปรและบริบท
- หากต้องการ扱กับภาษาโปรแกรมที่ใช้งานได้จริง จำเป็นต้องมี ตัวแปร และตัวอย่างจะขยายด้วยการเพิ่มฟังก์ชันให้เป็นรูปแบบ simply typed lambda calculus
- ไวยากรณ์ที่ขยายแล้วประกอบด้วย
- ตัวแปร
x - การนิยามฟังก์ชันแบบนามธรรม
λx:τ. e - การประยุกต์ใช้ฟังก์ชัน
e e - ชนิดฟังก์ชัน
τ → τ
- ตัวแปร
λx:τ. eสอดคล้องกับ(x:τ) => eใน TypeScript และf xสอดคล้องกับf(x)- ชนิดของตัวแปรขึ้นอยู่กับ บริบท ที่ตัวแปรปรากฏ ดังนั้นจึงไม่สามารถเขียนกฎในรูปง่าย ๆ อย่าง
⊢ x : ???ได้ - ดังนั้นการตัดสินการกำหนดชนิดจึงขยายเป็น
Γ ⊢ e : τΓคือบริบทหรือสภาพแวดล้อมของชนิด⊢แยกสมมติฐานตามบริบททางซ้ายออกจากประโยคที่ต้องพิสูจน์ทางขวา- อ่านว่า “ภายใต้บริบท
Γนิพจน์eมีชนิดτ”
- ในเชิงอัลกอริทึม
Γมองได้เหมือนอินพุตเพิ่มเติมในรูปMap<Variable, Type> - ในเชิงรูปนัย บริบทเองก็ถูกระบุเป็นโครงสร้างไวยากรณ์ด้วย
∅: บริบทว่างΓ, x:τ: บริบทที่เพิ่ม binding ของตัวแปร- บางครั้งใช้
•เป็นบริบทว่างแทน∅
- ในการแทนแบบนี้ บริบทมีลักษณะใกล้เคียงกับ association list ที่แมปชื่อตัวแปรไปยังชนิด
สิ่งที่บริบททำภายในกฎ
- กฎการกำหนดชนิดจำนวนมากไม่เปลี่ยนบริบท แต่ส่งต่อไปตามเดิม
Γ ⊢ true : Bool- ถ้า
Γ ⊢ e₁ : IntและΓ ⊢ e₂ : Intแล้วΓ ⊢ e₁ + e₂ : Int
- ในกฎของการใช้ตัวแปรและนิพจน์แลมบ์ดา บริบทมีบทบาทสำคัญ
- ถ้า
x:τ ∈ Γแล้วΓ ⊢ x : τ - ถ้า
Γ, x:τ₁ ⊢ e : τ₂แล้วΓ ⊢ (λx:τ₁. e) : τ₁ → τ₂
- ถ้า
- เมื่อตรวจสอบชนิดของเนื้อหา
eในแลมบ์ดา บริบทจะถูกขยายด้วย binding ใหม่x:τ₁ - กฎตัวแปรตัดสินว่า หากมี binding ของตัวแปรในบริบทปัจจุบัน ตัวแปรนั้นก็มีชนิดดังกล่าว
- บริบทถูกใช้เป็น กลไกสื่อสาร ที่ส่งข้อมูลระหว่างกฎแลมบ์ดากับกฎตัวแปร
- เพื่อความเรียบง่าย การระบุระบบชนิดข้อมูลด้วยวิธีนี้มักสมมติว่าตัวแปรทั้งหมดถูกแก้ความหมายแล้วและทำให้เป็นเอกลักษณ์แล้ว โดยไม่扱กับ variable shadowing
- กฎการประยุกต์ใช้ฟังก์ชันตรวจสอบชนิดของนิพจน์ฟังก์ชันและนิพจน์อาร์กิวเมนต์ร่วมกัน
e₁ต้องมีชนิดτ₁ → τ₂e₂ต้องมีชนิดτ₁- ชนิดของการประยุกต์ทั้งหมด
e₁ e₂จะเป็นτ₂
สัญกรณ์เพิ่มเติมที่พบบ่อย
- กฎอนุมานไม่ได้เขียนในแนวตั้งเสมอไป
- เงื่อนไขหลายข้ออาจวางเรียงกันในแนวนอนได้
- การจัดวางแนวตั้งและแนวนอนอาจผสมกันภายในกฎเดียวกันได้
- เงื่อนไขเหนือเส้นแนวนอนมักเป็น judgment อื่น แต่ก็อาจเป็น เงื่อนไขประกอบ (side condition) ที่เป็นเงื่อนไขบูลีนใด ๆ ได้
x:τ ∈ Γในกฎตัวแปรเป็นตัวอย่าง- ในระบบชนิดข้อมูลเชิงอัลกอริทึม อาจใช้
α freshซึ่งหมายความว่าαต้องเป็นตัวแปรชนิดใหม่ที่แยกจากตัวแปรชนิดอื่น
Subtyping
- Subtyping เป็นความสัมพันธ์ที่扱ความเข้ากันได้ระหว่างชนิดอย่างผ่อนคลายกว่าความเท่ากันแบบเคร่งครัด และต้องนิยามไว้อย่างชัดเจน
- โดยทั่วไปเขียนเป็น
τ₁ <: τ₂และอ่านว่า “τ₁เป็น subtype ของτ₂” - ความสัมพันธ์ subtyping แบบง่ายอาจแนะนำชนิดบนสุด
⊤และชนิดล่างสุด⊥τ <: τ: ทุกชนิดเป็น subtype ของตัวเองτ <: ⊤: ทุกชนิดเป็น subtype ของ⊤⊥ <: τ:⊥เป็น subtype ของทุกชนิด
- กฎแรกคือกฎสะท้อน และมักย่อว่า
refl - หากต้องการอนุญาต subtyping ต้องใช้ความสัมพันธ์นี้อย่างชัดเจนในกฎการกำหนดชนิดแต่ละกฎที่อนุญาต
- ในกฎการประยุกต์ใช้ฟังก์ชัน สามารถอนุญาตการประยุกต์ได้ถ้าชนิดของอาร์กิวเมนต์
τ₁เป็น subtype ของชนิดพารามิเตอร์τ₂
- ในกฎการประยุกต์ใช้ฟังก์ชัน สามารถอนุญาตการประยุกต์ได้ถ้าชนิดของอาร์กิวเมนต์
หลายบริบทและการตรวจสอบชนิดแบบสองทิศทาง
- ระบบชนิดข้อมูลบางระบบนิยามการตัดสินการกำหนดชนิดที่มีบริบทมากกว่าหนึ่งตัว
- บริบทที่สองมักเรียกว่า
Δ Γ;Δ ⊢ e : τมักใช้เมื่อบริบททั้งสองถูกใช้เหมือนอินพุตΓ ⊢ e : τ ⊣ Δมักใช้เมื่อΔถูกใช้เหมือนเอาต์พุต
- บริบทที่สองมักเรียกว่า
- บริบทที่สองถูกใช้ต่างกันตามวัตถุประสงค์
- อาจใช้ให้ตัวแปรบางตัวอ้างอิงได้เฉพาะภายในนิพจน์บางอย่าง
- ในภาษาโปรแกรมที่รับรู้ทรัพยากร อาจใช้เป็นบริบทเอาต์พุตเพื่อติดตามว่าตัวแปรใดถูกใช้หมดไปแล้ว
- การตรวจสอบชนิดแบบสองทิศทาง เป็นแนวทางที่ทำ type inference แบบไม่เป็นท้องถิ่นในขอบเขตจำกัดโดยไม่ใช้ตัวแก้ constraint
- ระบบแบบสองทิศทางแบ่ง judgment ทั่วไป
Γ ⊢ e : τออกเป็น judgment เฉพาะสองแบบΓ ⊢ e ⇐ τ: judgment สำหรับ การตรวจสอบ (checking) ว่านิพจน์eมีชนิดที่คาดหวังτหรือไม่ โดยในเชิงอัลกอริทึมτเป็นอินพุตΓ ⊢ e ⇒ τ: judgment สำหรับ การอนุมาน (inference) ที่ใช้เมื่อไม่มีข้อมูลชนิดที่คาดหวัง โดยในเชิงอัลกอริทึมτเป็นเอาต์พุต
- judgment ทั้งสองถูกนิยามแบบเรียกซ้ำร่วมกัน เพื่อส่งต่อข้อมูลชนิดในสองทิศทาง
- วิธีนี้ช่วยละ annotation ของชนิดบางส่วนได้ และกฎการตรวจสอบของ lambda abstraction สามารถรับชนิดพารามิเตอร์จากชนิดฟังก์ชันที่คาดหวังได้ จึงละ annotation ของ binder ตัวแปรได้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Guy Steele เคยบรรยายเรื่องนี้มาก่อน เขายังตั้งชื่อที่ค้นหาได้ให้กับสัญกรณ์บางแบบด้วย เช่น ไดอะแกรมกฎอนุมานแบบสองมิติ
เขาเรียกสิ่งนี้ว่า เมตาสัญกรณ์ของวิทยาการคอมพิวเตอร์ แต่โดยส่วนตัวแล้วดูเหมือนจะใกล้กับทฤษฎีภาษาโปรแกรมมากกว่า https://m.youtube.com/watch?v=dCuZkaaou0Q
https://en.wikipedia.org/wiki/Guy_Steele Guy Steele
https://www.codemesh.io/codemesh2017/guy-l-steele ทอล์ก "A Cobbler's Child" ที่ Code Mesh 2017
https://www.youtube.com/watch?v=qNPlDnX6Mio "A Cobbler's Child" (วิดีโอบน youtube)
https://www.youtube.com/watch?v=dCuZkaaou0Q "It's Time for a New Old Language" (วิดีโอบน youtube)
https://news.ycombinator.com/item?id=15473199 การอภิปรายบน HN
https://labs.oracle.com/pls/apex/f?p=94065:40150:0::::P40150... สไลด์
แปลกที่คนซึ่งพยายามพูดถึงศิลปะเชิงช่างของมนุษย์ที่แม่นยำที่สุดให้แม่นยำที่สุด กลับใช้ สัญกรณ์ที่คลุมเครือและไม่สอดคล้องกัน
สัญกรณ์นี้ย้อนกลับไปได้ถึง Frege ถ้าไม่รู้ว่าต้องค้นหาอะไร ก็หายาก แต่บทความนี้ดูเป็นสรุปที่ค่อนข้างดี: https://plato.stanford.edu/entries/frege-logic
สัญลักษณ์ turnstile
|-ถูกใช้มาก่อนแล้ว และเส้นแนวนอนที่ในชั้นเรียนเรียกว่า “Fregescher Schlussstrich” หรือเส้นขีดสรุปของ Frege เดิมทีน่าจะเป็นส่วนหนึ่งของ turnstile เอง ก่อนจะแยกออกมาเป็นองค์ประกอบต่างหากในสัญกรณ์สมัยใหม่Types and Programming Languages ของ Benjamin C. Pierce เป็นตำราที่ดีที่ครอบคลุมเรื่องแบบนี้
แม้จะเรียนเอกวิทยาการคอมพิวเตอร์ ผมก็ยังสับสนกับความแตกต่างของความหมายระหว่าง
|–กับ|=และตัวแปรที่ใช้ว่าแต่ละตัวอยู่ใน ระดับเมตาไวยากรณ์ ไหนที่ย้อนแย้งคือ เหตุผลหนึ่งเป็นเพราะสัญกรณ์เองไม่มีไทป์ที่ระบุชัดเจน
สำหรับคนที่ลังเลว่าจะอ่านดีไหม: บทความนี้เป็นคำอธิบาย สัญกรณ์ระบบชนิดข้อมูล ที่พบในเปเปอร์วิทยาการคอมพิวเตอร์ และโดยพื้นฐานแล้วเป็นบทนำเรื่องสัญกรณ์ BNF สำหรับระบบชนิดข้อมูล กฎอนุมาน ฯลฯ
ดูเหมือนเป็นสรุปที่ดี
ผมเข้าใจแนวคิดเชิงตรรกะของการนำไทป์ไปใช้ แต่ไม่ได้อ่านเปเปอร์วิทยาการคอมพิวเตอร์บ่อยนัก เลยยังจับคู่สัญลักษณ์กับความหมายในหัวได้ไม่ค่อยติด
ในตัวอย่าง
𝗍𝗋𝗎𝖾+2:𝖨𝗇𝗍หมายถึง “𝗍𝗋𝗎𝖾+2มีไทป์เป็น𝖨𝗇𝗍” แต่บอกว่าประหลาดยิ่งกว่าเดิมเพราะนิพจน์𝗍𝗋𝗎𝖾+2เองก็ไม่สมเหตุสมผลและไม่มีไทป์แต่ใน Python นั้น
True + 2เป็นจำนวนเต็มจริง ๆ และค่าก็เป็น 3 ไม่ว่าจะควรเป็นแบบนั้นหรือไม่ แต่มันเป็นอย่างนั้นจริง ๆTrue + 2สมเหตุสมผล ก็แค่นิยาม กฎการตัดสิน ที่อนุญาตแบบนั้นเองตรรกะและทฤษฎีระบบชนิดข้อมูลไม่ได้สนใจในตัวเองว่าคุณใช้สัจพจน์และกฎอนุมานแบบไหน เพียงแต่ช่วยให้อนุมานกฎเหล่านั้นและปฏิสัมพันธ์ระหว่างกันได้ เช่น อาจกำหนด
|- True : Bool,|- True : Intหรือถ้าต้องการอนุญาตเฉพาะในนิพจน์บางอย่าง ก็สร้างกฎให้ดึง|- True + x: Intออกมาจาก|- x : Intได้trueถูกแมปเป็น 1 ดังนั้นtrue+1=2True + 2จะไม่เกิดข้อผิดพลาด แต่ก็ยังเป็นเรื่องโง่อยู่ดี เพราะทำให้ความหมายเชิงนัยของภาษายากต่อการอนุมาน เพียงเพื่อให้โปรแกรมเมอร์ได้ syntax sugar เล็กน้อยดีเลย สงสัยมาหลายปีแล้ว แต่ไม่รู้ว่าจะตั้งคำค้นอย่างไรถ้าจะหาข้อมูลเพิ่ม
บางครั้งก็รู้สึกไม่ชอบขึ้นมาเฉย ๆ เวลามีคนเอา ความรู้ลับ ที่อุตส่าห์เรียนมาอย่างยากลำบากมาแจกฟรี ;) ถ้าตอนผมเรียนมีบทความแบบนี้ก็คงดีมาก หวังว่าพอเข้าถึงได้ง่ายขึ้นแล้ว ภาษาแย่ ๆ จะลดลง
ตอนอ่าน Ada Reference Manual ผมจำไวยากรณ์แบบนี้ได้ทันที แม้จะไม่รู้ชื่อ แต่พอเห็นกรณีใช้งานจริงก็รู้สึกน่าสนใจ และทั้งภาษาก็ถูกนิยามด้วยสัญกรณ์แบบนั้น
ตัวอย่าง: https://ada-lang.io/docs/arm/AA-3/AA-3.7#syntax
Ada Reference Manual ระบุสัญกรณ์ที่ตนใช้ไว้อย่างชัดเจน โดยใช้รูปแบบดัดแปลงของ Backus-Naur Form และในหัวข้อที่ลิงก์ไว้ก็อธิบายรูปแบบดัดแปลงเฉพาะนั้น
ตรงนี้ดูเหมือนเป็นโอกาสดีที่จะเผยแพร่ “จุดยืนที่ผมจะยืนหยัดไปจนสุดทาง” ข้อหนึ่ง ใน รูปแบบ type annotation ที่ใช้โคลอน ช่องว่างสองข้างโคลอนควรเท่ากัน
สำหรับผม มันเหมือนมีสัญลักษณ์สองแบบที่บังเอิญมีรูปร่างเหมือนกัน คือจุดสองจุด แบบหนึ่งคือ label colon ซึ่งเหมือนในภาษาอังกฤษ คือส่วนหน้าทำหน้าที่แนะนำส่วนหลัง หรือด้านซ้ายเป็นป้ายกำกับของด้านขวา เช่น การเริ่มบล็อกใน Python, คู่ key-value, คู่ชื่อ-ค่าใน struct ของ C หรือ Rust
อีกแบบคือ type annotation ที่ยืมมาจากคณิตศาสตร์ มันเป็นความสัมพันธ์ทวิภาค และความสัมพันธ์ทวิภาคควรเว้นวรรคซ้ายขวาเท่ากัน เราไม่เขียน
x= 1,x> y,x+ zฉันใด ก็ไม่ควรเขียนx: Xแต่ควรเขียนx : Xถึงจะเป็นธรรมชาติพอเห็น
a: bผมจะอ่านเป็น label colon ทันที และถ้ามันเป็น type annotation ก็ต้องมีการแปลงทางความคิดเพิ่มขึ้นเล็กน้อยทุกครั้ง นี่เป็นเรื่องของไวยากรณ์ภาษาโปรแกรม และโดยส่วนตัวผมชอบx : Xมากกว่าX xมาก[1] “Evangelion” เป็นคำเท่ ๆ ที่มาจาก εὐαγγέλιον ซึ่งแปลว่าข่าวดี [2] https://en.wikipedia.org/wiki/Colon_(punctuation)#Usage_in_E...
f: X->Yที่เว้นวรรคด้านขวาของโคลอนมากกว่าอยู่จริง และในหนังสือ 3 เล่มที่ผมตรวจดู มี 1 เล่มที่ใช้แต่สัญกรณ์แบบนั้นอีกทั้งแบบนั้นก็ยังค่อนข้างใกล้กับการติดป้ายกำกับอยู่ดี คือเป็นการติดป้ายกำกับสาทิศสัณฐานชนิดหนึ่ง กรณีที่โคลอนถูกใช้ในคณิตศาสตร์ด้วยความหมายที่ต่างออกไปจริง ๆ คือเมื่อใช้เป็นตัวย่อของ
such thatเช่นในการนิยามเซตแบบ{ x : x \in IN and x | 2}หรือใช้ร่วมกับตัวบ่งปริมาณ ซึ่งพบได้บ่อยX xที่พบได้ทั่วไปเลยx: Xสำหรับผมเป็นธรรมชาติกว่ามาก และยังรู้สึกใกล้เคียงกับวิธีใช้โคลอนในภาษาธรรมชาติด้วยคือมีประพจน์หนึ่ง แล้วสิ่งที่ตามหลังโคลอนมาอธิบายประพจน์นั้นให้ละเอียดขึ้น ซึ่งก็เข้ากับ type พอดี เพราะ type ก็เป็นข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่อยู่ทางซ้าย
t[ช่องว่าง]:[ช่องว่าง]Tทฤษฎีชนิดข้อมูล โดยรวมมีด้านที่ยุ่งเหยิงและไม่ค่อยสอดคล้องกันอยู่ แต่เฉพาะกรณีนี้เป็นตัวอย่างที่หาได้ยากซึ่งทุกคนค่อนข้างสอดคล้องกัน ผมสงสัยว่าสมัยปริญญาตรีตัวเองเขียนอย่างไร เลยไปดู แล้วก็พบว่าผมเองก็เขียนแบบสมมาตรสวยงามไว้เหมือนกัน: https://dvt.name/logic/horse2.pdf
x: Xสอดคล้องกับการใช้แบบ “มีคำอธิบายตามหลังโคลอน”กล่าวคือคล้ายกับ
variable x: It’s an X.age: intสามารถอ่านแปลงเป็นภาษาอังกฤษได้ง่าย ๆ ว่า “person’s age: an integer”ดังนั้นโคลอนจึงไม่เคยทำให้ผมรู้สึกขัดตามากนัก