ประเภทถูกลบใน Haskell หรือไม่


13

Haskell มีความคิดเกี่ยวกับ "ฟังก์ชั่นทั่วไป" ที่มีความคล้ายคลึงกันชัดเจนกับเสียงกระเพื่อมทั่วไป - หากไม่มีประสบการณ์กับ Haskell หรือด้วยเสียงกระเพื่อมสามัญฉันอาจจะประมาณที่นี่มาก ซึ่งหมายความว่าเราสามารถกำหนดเครื่องมือto_stringอำนวยความสะดวกทั่วไปเพื่อกำหนดการแสดงสตริงสำหรับทุกประเภท แน่นอนว่าสถานที่จะต้องมีการกำหนดไว้ในกรณีพิเศษ แต่มีฟังก์ชั่นที่มีลายเซ็นto_stringα → string

ประเภทจะถูกลบใน Haskell เหมือนกับที่อยู่ใน OCaml หรือไม่ ถ้าใช่การนำไปปฏิบัติของ“ ฟังก์ชั่นทั่วไป” ใน Haskell แตกต่างจากเสียงกระเพื่อมทั่วไปชนิดใดที่เป็นแบบไดนามิกและไม่ถูกลบ?

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


5
จำไว้ว่าคุณอาจไม่สามารถกำหนดฟังก์ชั่นที่ไม่สำคัญa -> Stringได้ คุณมีแนวโน้มที่จะมีข้อ จำกัด Show a => a -> Stringประเภทเช่น
DJG

คำตอบ:


16

คำตอบที่ทำให้เข้าใจผิด

จะต้องมีการแยกความแตกต่างระหว่าง "ตัวแปร" และ "ad-hoc เกินพิกัด" polymorphism พารามิเตอร์หมายถึง "มีพฤติกรรมที่เหมือนกันทุกประเภท" ในขณะที่ "ad-hoc" - สิ่งที่ Simon อ้างถึงเป็น polymorphic - เปลี่ยนแปลงการใช้งานตามประเภท

ตัวอย่างของทั้งคู่คือreverse :: [a] -> [a], ซึ่งเป็นพารามิเตอร์และshow :: Show a => a -> Stringซึ่งเป็น "ad-hoc" มากเกินไป

หากคุณต้องการสัญชาตญาณที่เป็นนามธรรมมากกว่านี้ฉันคิดว่ามันช่วยในการพิจารณาคลาสของคำกริยาภาษาธรรมชาติที่ 'ทำงาน' สำหรับวัตถุทั้งหมดเช่น "เป็นของตัวเอง" หรือ "คิดถึง" ซึ่งไม่มีข้อ จำกัด ในวัตถุ แต่ " เพื่อเปิด "ต้องการสิ่งที่เรากำลังพูดถึงสามารถเปิดได้ ฉันสามารถ 'คิดประตู' และ 'เปิดประตู' ในขณะที่มันไม่สมเหตุสมผลเช่น 'เปิดต้นไม้' หากต้องการยกตัวอย่างยิ่งไปกว่านั้น "to open" คือ "ad-hoc polymorphic" เป็น "to open a window" และ "to open a-ticket ร้องเรียนกับฝ่ายบริการลูกค้า" เป็นสองสิ่งที่แตกต่างกันมาก หากดูเหมือนว่าถูกบังคับ - ลืมมัน! มันใช้งานได้สำหรับฉัน

ทั้งสองได้รับการแก้ไขในเวลารวบรวมและในความเป็นจริง "ลบ" Modulo นามสกุล GHC ต่างๆและแม่แบบ Haskell ฯลฯ ประเภทจะในความเป็นจริงลบที่รวบรวมเวลาและไม่เคยมีการตรวจสอบในเวลาทำงาน

ฟังก์ชัน polamorphic polamorphic ทำงานเหมือนกันทุกประเภทดังนั้นจึงจำเป็นต้องสร้างโค้ดเพียงชิ้นเดียวในขณะที่คอมไพเลอร์ตัดสินใจในเวลารวบรวมซึ่งเวอร์ชั่นของฟังก์ชั่น นี่คือเหตุผลที่ข้อ จำกัด ของหนึ่งอินสแตนซ์ต่อชนิดต่อประเภทคลาสและ "newtype" ที่สอดคล้องกันมีอยู่รอบตัว

การดำเนินการเป็นรายละเอียดใน SPJs ตำราและ Wadler และ Blotts กระดาษชนิดชั้นเรียน


คุณคิดว่าฉันควรลบคำตอบของฉันหรือไม่
Simon Bergot

ไม่มีก็ปรับด้วยคำเตือนของคุณไม่ได้กดปุ่มคำศัพท์ที่แน่นอน)
คริส

คุณช่วยขยายให้หน่อยได้ไหมว่าทำไม GHC ถึงสามารถลบประเภทได้? ต้องขอบคุณการพิมพ์หลักหรือไม่
Simon Bergot

2
โดยทั่วไปที่รันไทม์ทั้งฟังก์ชัน polamorphic polymorphic อาจมีอยู่เพียงครั้งเดียวและเรียกฟังก์ชัน ad-hoc polymorphic ผ่านวิธีการแจกจ่ายเสมือนบางอย่างหรือรหัสทั้งหมดอาจถูกสร้างขึ้นสำหรับแต่ละประเภทแยกต่างหากและเรียกการเชื่อมโยงแบบสแตติก การนำไปใช้อย่างใดอย่างหนึ่งนั้นถูกต้องจากมุมมองของภาษา (โปรดทราบว่า Haskell ไม่มีประเภท polymorphic สิ่งนั้นสามารถสร้างได้ด้วยforallส่วนขยายGHC เท่านั้น)
Jan Hudec

มีส่วนขยาย GHC ที่ไม่อนุญาตให้ลบประเภทหรือไม่ การบรรทุกเกินพิกัดเป็นค่าคงที่และไม่มีประเภทพึ่งพาเต็มรูปแบบฉันไม่สามารถคิดถึงอะไรได้เลย
Daniel Gratzer

1

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

ฉันคิดว่าคุณกำลังสับสนกับยาชื่อสามัญที่มีความหลากหลาย

ประเภททั่วไปเช่นList<Foo>ใช้เพื่ออธิบายประเภทที่ใช้ประเภทอื่นเป็นพารามิเตอร์และอนุญาตให้ตรวจสอบประเภทยิ่งขึ้น

ฟังก์ชั่นทั่วไปใน Haskell count:: List a -> Intอาจจะ มันรับรายการประเภทใด ๆ และส่งกลับจำนวนขององค์ประกอบ มีการนำไปใช้เพียงครั้งเดียวเท่านั้น

โดยปกติเมื่อกำหนด List คุณจะไม่สามารถคาดเดาสิ่งใดเกี่ยวกับ T คุณสามารถเก็บและส่งคืนได้เท่านั้น

to_stringฟังก์ชั่นของคุณเป็นฟังก์ชั่น polymorphic ซึ่งหมายความว่ามันจะทำงานแตกต่างกันภายใต้สถานการณ์ที่แตกต่างกัน ใน Haskell สิ่งนี้จะทำกับ typeclasses ซึ่งทำงานเหมือนกับคำคุณศัพท์สำหรับประเภท

คุณมีประเภทของShowคลาสที่กำหนดshow :: a -> Stringฟังก์ชั่น

เมื่อชนิดFooดำเนินShowtypeclass showก็จะต้องให้คำจำกัดความของ ชนิดนี้สามารถใช้ในฟังก์ชันที่ต้องการตัวระบุShow(ตามShow a => a -> whatever) Haskell ไม่สามารถลบชนิดเนื่องจากฟังก์ชันเหล่านั้นต้องค้นหาการใช้งานที่ถูกต้องของshowฟังก์ชัน


ในเสียงกระเพื่อมสามัญฟังก์ชัน polymorphic เรียกว่า "ฟังก์ชั่นทั่วไป" IIRC และฉันใช้คำศัพท์เดียวกัน (สับสน) คำตอบของคุณมีประโยชน์และการโต้แย้งครั้งสุดท้ายของคุณค่อนข้างน่าเชื่อ .-)
user40989

“ มีการนำไปปฏิบัติเพียงครั้งเดียวเท่านั้น” - มีเพียงสิ่งเดียวที่เหมาะสมแน่นอน แต่มีความเป็นไปได้มากมายเหลือล้น ฟังก์ชั่นประเภท a → b มี | b | ^ | a | การนำไปใช้ที่เป็นไปได้ (พิจารณาจำนวนฟังก์ชั่นของประเภท Bool → Bool) และรายการไม่ จำกัด ขนาดด้านบน
Jon Purdy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.