สิ่งที่เป็นปัญหาในทางปฏิบัติกับทางแยกและสหภาพประเภทคืออะไร?


22

ฉันกำลังออกแบบภาษาการเขียนโปรแกรมฟังก์ชั่นแบบเรียบง่ายที่พิมพ์ได้ง่ายเป็นประสบการณ์การเรียนรู้

ดูเหมือนว่าระบบประเภทที่ฉันได้นำไปใช้จนถึงตอนนี้ (มีงานเพิ่มเติมเล็กน้อย) รวมประเภทการแยกและสหภาพเข้าด้วยกันเช่นคุณอาจมี:

  • <Union String Integer>
  • <Union Integer Foo>
  • จุดตัดของทั้งสองประเภทด้านบนจะเป็นที่ราบ Integer
  • สหภาพของทั้งสองประเภทจะเป็น <Union String Integer Foo>

ความจริงที่ว่านี่เป็นไปได้แน่นอนไม่จำเป็นต้องหมายความว่ามันเป็นแนวคิดการออกแบบที่ดี โดยเฉพาะอย่างยิ่งฉันค่อนข้างกังวลเกี่ยวกับความยากลำบากในการใช้งานของการรักษาประเภทไม่ปะติดปะต่อและ / หรือการจัดการการทับซ้อน

ข้อดี / ข้อเสียของการรวมคุณสมบัติดังกล่าวในระบบพิมพ์คืออะไร?

คำตอบ:


26

ต่อไปนี้เป็นสิ่งที่ควรทราบ:

  • แม้ว่าโดยทั่วไปเราคิดว่าเรารู้ว่าสิ่งที่เราหมายถึงสี่แยกชุดทฤษฎีและสหภาพมีหลายที่แตกต่างกันจะใช้เวลาในสิ่งที่ตรงสี่แยกและสหภาพประเภทเป็น ดังนั้นมันจึงคุ้มค่าที่จะหยุดสิ่งนี้ก่อนที่คุณจะเริ่มดำเนินการ
  • องค์ประกอบหนึ่งที่ฉันคิดว่ามีความสำคัญอย่างยิ่งสำหรับการทำความเข้าใจกับทางแยกและสหภาพคือแนวคิดของการปรับแต่งประเภทโดยพื้นฐานแล้วความคิดที่ว่าโปรแกรมมี "archetype" ที่แท้จริงบางอย่าง (เช่น " fooเป็นฟังก์ชันจากจำนวนเต็มถึงจำนวนเต็ม") จากนั้นได้รับการปรับปรุงเพื่อแสดงคุณสมบัติที่แม่นยำยิ่งขึ้น (เช่น " fooใช้จำนวนเต็มเป็นจำนวนเต็มคู่ถึงจำนวนเต็มและเลขจำนวนเต็มคี่เป็นจำนวนเต็มคี่") ด้วยแนวคิดของการปรับแต่งในมือคุณสมบัติหลักที่แยกความแตกต่างและสหภาพจากผลิตภัณฑ์และผลรวมคือการแยก / สหภาพของทั้งสองประเภทสามารถเกิดขึ้นได้ก็ต่อเมื่อพวกเขาปรับแต่งต้นแบบเดียวกัน กล่าวอีกนัยหนึ่งกฎการก่อตัวประเภทสำหรับการแยกและสหภาพอาจแสดงเช่นนั้น (อ่าน "SA"เป็น" ปรับแต่งA ") S ASA ในขณะที่กฎการก่อตัวสำหรับผลิตภัณฑ์และผลรวมปกติคือ SA
    SATASTASATASTA
    SATBS* * * *TA* * * *BSATBS+TA+B
  • เนื่องจากทางแยกและสหภาพสามารถใช้เพื่อยืนยันที่แม่นยำยิ่งขึ้นเกี่ยวกับพฤติกรรมการทำงานของโปรแกรมเป็นเรื่องธรรมดาที่การพิมพ์จะอ่อนไหวต่อลำดับการประเมินผล ตัวอย่างเช่นเอกสาร(2)และ(4)ด้านล่างอธิบายว่าทำไมกฎการพิมพ์และการพิมพ์ย่อย "ชัดเจน" (และมาตรฐานที่ค่อนข้างเป็นธรรม) สำหรับการแยกและสหภาพแรงงานนั้นไม่ถูกต้องสำหรับภาษาที่เหมือน ML (เนื่องจากมีผลข้างเคียงและไม่ใช่ การเลิกจ้าง) คุณได้รับการเตือน!
  • ด้วยเหตุผลที่คล้ายกันการอนุมานประเภทโกลบอลโดยทั่วไปจะไม่สามารถใช้งานได้หรือไม่สามารถตัดสินใจได้ อันที่จริงแนวคิดทั้งหมดของ "ตัวพิมพ์หลัก" นั้นมีเนื้อหาว่าเป็นปลาเฮอริ่งแดงเนื่องจากฟังก์ชั่นอาจตอบสนองคุณสมบัติที่แตกต่างจำนวนมากซึ่งไม่เกี่ยวข้องกับการใช้งานตามที่ตั้งใจไว้ (เช่น " fooใช้จำนวนเต็มจำนวนเต็ม แต่วิธีการปฏิบัติเพื่อแยกและสหภาพ (ดู(3) , (4) ) โดยทั่วไปขึ้นอยู่กับการรวมกันของการอนุมานและการตรวจสอบ

ฉันคิดว่าบางประเด็นข้างต้นอาจฟังดูเป็นลบแม้ว่าฉันจะไม่เรียกพวกเขาว่า "ข้อเสีย" แต่เป็นเพียง "ความเป็นจริง" ของการแยกและประเภทสหภาพ ในอีกด้านหนึ่งจากมุมมองของการออกแบบภาษาเหตุผลหนึ่งที่ทำให้ความพยายามในการสนับสนุนทางแยกและสหภาพ (และทำให้ถูกต้อง!) ก็คือพวกเขาอนุญาตให้แสดงคุณสมบัติของโปรแกรมที่แม่นยำยิ่งขึ้นในลักษณะที่เพิ่มขึ้นอย่างเป็นธรรม การเปลี่ยนแปลงที่รุนแรงน้อยกว่าทฤษฎีประเภทพึ่งพา

รายการอ่านสั้น ๆ :

  1. การออกแบบ Forsythe การเขียนโปรแกรมภาษาโดย John C. Reynolds
  2. ประเภทการแยกและผลการคำนวณโดย Rowan Davies และ Frank Pfenning
  3. การปรับแต่งประเภทการตรวจสอบจริงโดย Rowan Davies (วิทยานิพนธ์)
  4. Typechecking แบบสามทิศทางโดย Joshua Dunfield และ Frank Pfenning

คำตอบที่ดีขอบคุณมาก ลิงก์มีประโยชน์อย่างมากและให้ความกระจ่าง - ดังนั้นขอขอบคุณที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง!
mikera
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.