พหุสัณฐานและเจเนอริกส์
พหุสัณฐาน (Polymorphism) ช่วยให้โค้ดชุดเดียวสามารถทำงานได้อย่างสม่ำเสมอในหลายประเภท โดยมีพหุสัณฐานแบบพารามิเตอร์ (parametric polymorphism) หรือเจเนอริกส์ (generics), พหุสัณฐานเฉพาะกิจ (ad hoc polymorphism) หรือการโอเวอร์โหลด (overloading) และคลาสประเภท (type classes) และพหุสัณฐานแบบประเภทย่อย (subtype polymorphism) เป็นรูปแบบหลัก
Definition
พหุสัณฐาน (Polymorphism) คือคุณสมบัติที่ฟังก์ชัน ประเภท หรือการดำเนินการเดียวสามารถนำไปใช้กับค่าของประเภทได้มากกว่าหนึ่งประเภท โดยพหุสัณฐานแบบพารามิเตอร์ (parametric polymorphism) ทำเช่นนั้นอย่างสม่ำเสมอผ่านพารามิเตอร์ประเภท (type parameters) หรือเจเนอริกส์ (generics) ในขณะที่พหุสัณฐานเฉพาะกิจ (ad hoc polymorphism) จะส่งไปยังการใช้งานเฉพาะประเภท
Scope
หัวข้อนี้ครอบคลุมพหุสัณฐานประเภทหลักๆ ได้แก่ พหุสัณฐานแบบพารามิเตอร์ที่เกิดขึ้นจากเจเนอริกส์และ System F, พหุสัณฐานเฉพาะกิจผ่านการโอเวอร์โหลดและคลาสประเภท, และพหุสัณฐานแบบรวม (inclusion polymorphism) หรือประเภทย่อย (subtype polymorphism) นอกจากนี้ยังกล่าวถึงความเป็นพารามิเตอร์ (parametricity) และหลักการให้เหตุผลที่แข็งแกร่งที่เกิดขึ้นจากมัน รวมถึงวิธีการคอมไพล์และจำกัดข้อจำกัดของนามธรรมแบบเจเนอริกส์
Core questions
- เจเนอริกส์ให้การนำกลับมาใช้ใหม่ได้อย่างไรโดยไม่ลดทอนความปลอดภัยของประเภท?
- ความเป็นพารามิเตอร์คืออะไร และให้การรับประกันอะไรบ้างโดยไม่ต้องเสียค่าใช้จ่าย?
- คลาสประเภทจัดระบบการโอเวอร์โหลดเฉพาะกิจได้อย่างไร?
- การนิยามแบบเจเนอริกส์ถูกคอมไพล์อย่างไร และข้อจำกัดใดบ้างที่สามารถจำกัดพารามิเตอร์ประเภทได้?
Key theories
- ความเป็นพารามิเตอร์ (ทฤษฎีบทนามธรรม)
- ทฤษฎีบทนามธรรมของ Reynolds แสดงให้เห็นว่าฟังก์ชันพหุสัณฐานแบบพารามิเตอร์มีพฤติกรรมที่สม่ำเสมอในทุกประเภท ซึ่งเป็นคุณสมบัติที่จำกัดพฤติกรรมที่เป็นไปได้โดยไม่ขึ้นกับการสร้างอินสแตนซ์ประเภทที่เป็นรูปธรรม
- ทฤษฎีบทฟรี
- Wadler แสดงให้เห็นว่าประเภทของฟังก์ชันพหุสัณฐานแบบพารามิเตอร์เพียงอย่างเดียวบ่งบอกถึงทฤษฎีบทฟรีเกี่ยวกับพฤติกรรมของมัน ซึ่งเป็นผลโดยตรงและเป็นประโยชน์ของความเป็นพารามิเตอร์
- คลาสประเภทสำหรับการโอเวอร์โหลดที่มีหลักการ
- Wadler และ Blott ได้นำเสนอคลาสประเภท ซึ่งให้พหุสัณฐานเฉพาะกิจมีพื้นฐานทางทฤษฎีประเภทที่สอดคล้องกัน โดยการดำเนินการที่โอเวอร์โหลดจะถูกแก้ไขโดยการส่งพจนานุกรมการใช้งานเมธอดโดยนัย
Clinical relevance
เจเนอริกส์และพหุสัณฐานเป็นหัวใจสำคัญของการออกแบบไลบรารีที่นำกลับมาใช้ใหม่ได้และเฟรมเวิร์กคอลเลกชันในภาษาโปรแกรมสมัยใหม่ คลาสประเภท (type classes) และสิ่งที่คล้ายกัน (traits, concepts, protocols) ให้การโอเวอร์โหลดที่ปลอดภัยต่อประเภทและมีหลักการ ในขณะที่ความเป็นพารามิเตอร์ (parametricity) สนับสนุนการให้เหตุผลเพื่อความถูกต้องและการปรับปรุงประสิทธิภาพของคอมไพเลอร์
History
System F ซึ่งรวบรวมพหุสัณฐานแบบพารามิเตอร์ ถูกค้นพบโดยอิสระโดย Girard และ Reynolds ในช่วงต้นทศวรรษ 1970 ML นำพหุสัณฐานพร้อมการอนุมานมาใช้ในทางปฏิบัติ Cardelli และ Wegner ได้จัดประเภทรูปแบบของพหุสัณฐานในการสำรวจปี 1985 Reynolds ได้กำหนดความเป็นพารามิเตอร์อย่างเป็นทางการในปี 1983 และคลาสประเภทของ Wadler และ Blott ในปี 1989 ได้กำหนดรูปแบบการโอเวอร์โหลดใน Haskell และมีอิทธิพลต่อ traits และ concepts ในที่อื่นๆ
Debates
- การลบประเภทเทียบกับการทำให้เจเนอริกส์เป็นจริง
- ผู้พัฒนาภาษาถกเถียงกันเรื่องการคอมไพล์เจเนอริกส์โดยการลบประเภท ซึ่งง่ายแต่สูญเสียข้อมูลประเภทขณะรันไทม์ เทียบกับการทำให้พารามิเตอร์ประเภทเป็นจริงขณะรันไทม์ ซึ่งช่วยให้สามารถตรวจสอบภายในได้แต่มีค่าใช้จ่ายในด้านความซับซ้อนและขนาดโค้ด
Key figures
- John Reynolds
- Jean-Yves Girard
- Philip Wadler
- Luca Cardelli
- Robin Milner
Related topics
Seminal works
- reynolds1983
- wadler1989free
- wadler1989
- cardelli1985
Frequently asked questions
- ความแตกต่างระหว่างพหุสัณฐานแบบพารามิเตอร์และเฉพาะกิจคืออะไร?
- พหุสัณฐานแบบพารามิเตอร์ใช้การใช้งานที่สม่ำเสมอเพียงอย่างเดียวกับอาร์กิวเมนต์ประเภททั้งหมด (เช่นเดียวกับเจเนอริกส์) ในขณะที่พหุสัณฐานเฉพาะกิจจะเลือกการใช้งานเฉพาะประเภท เช่นเดียวกับการโอเวอร์โหลดหรือคลาสประเภท
- ความเป็นพารามิเตอร์ให้อะไรแก่เรา?
- ความเป็นพารามิเตอร์รับประกันว่าฟังก์ชันเจเนอริกส์จะปฏิบัติต่ออินสแตนซ์ประเภททั้งหมดอย่างสม่ำเสมอ ซึ่งทำให้เกิด 'ทฤษฎีบทฟรี' เกี่ยวกับพฤติกรรมของมันที่สามารถอนุมานได้จากลายเซ็นประเภทของมันเพียงอย่างเดียว