วิจัยเกี่ยวกับการอนุมานประเภทการโทรตามไซต์หรือไม่


9

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

อย่างไรก็ตามฉันไม่ได้โชคดีในการหางานวิจัยเกี่ยวกับวิธีการนี้อาจเป็นเพราะฉันไม่ทราบคำศัพท์ที่ถูกต้องเพื่ออธิบายสิ่งที่ฉันพูดถึง ตัวชี้ใด ๆ


สิ่งที่คุณกำลังอธิบายมีคำแนะนำของการอนุมานประเภทสองทิศทางเว้นแต่ว่าฉันเข้าใจผิด อย่างไรก็ตามการอธิบายสิ่งที่คุณพยายามทำอาจทำให้ชัดเจน
Dominic Mulligan

คุณกำลังถามเพราะคุณกำลังหาวิธีที่จะทำหน้าที่โพลีมอร์ฟิคที่เชี่ยวชาญหรือไม่?
nponeccop

ฉันส่วนใหญ่แค่พยายามเรียนรู้เพิ่มเติมเกี่ยวกับระบบการพิมพ์จริง ๆ และใช่ฉันคิดว่าส่วนใหญ่เกี่ยวกับวิธีการจัดการกับฟังก์ชัน polymorphic (และการเรียกใช้เมธอดในภาษา OO สิ่งเดียวกัน) ฉันพยายามระบุเงื่อนไขที่เหมาะสมสำหรับสิ่งนี้เพื่อให้ฉันสามารถอ่านได้
Derek Thurn

คำตอบ:


11

ระบบเกือบทั้งหมดที่มีการอนุมานประเภทใช้ข้อมูลไซต์ของไซต์เพื่อทำสิ่งนี้ ตัวอย่าง ได้แก่ Standard ML, OCaml, F # และ Haskell ภาษาอื่น ๆ อีกมากมายใช้ข้อมูลไซต์การโทรเพื่ออนุมานพารามิเตอร์การสร้างอินสแตนซ์ของพารามิเตอร์เช่น Java, C #, Scala และ Typed Racket สิ่งนี้มักเกิดจากชื่อ "Local Type Inference"

ฉันจะอธิบายสิ่งที่คุณกำลังมองหาในฐานะ "การอนุมานประเภท" และคุณควรเริ่มต้นด้วยการค้นหาสิ่งที่รู้จักกันทั่วไปว่าเป็นระบบ "Hindley-Milner" หน้า Wikipedia ให้การแนะนำที่สมเหตุสมผลและชี้ไปที่เอกสารต้นฉบับ

สถานที่ที่จะเริ่มต้นสำหรับการอนุมานประเภท Local คือกระดาษต้นฉบับของ Pierce และ Turner อ่านได้ดีที่สุดในเวอร์ชัน TOPLAS 2000 ( ACM , PDF )


กระดาษของ Pierce and Turner นั้นสว่างมากขอบคุณ คุณทราบหรือไม่ว่ามีการใช้อัลกอริทึมน้อยที่สุดที่อธิบายไว้ในโค้ด ฉันคิดว่ามันน่าสนใจมากถ้าได้ดูเช่นกันถ้ามี
Derek Thurn

ฉันไม่รู้การใช้งานขั้นต่ำที่สุด มีอยู่ใน Typed Racket และอีกหนึ่งใน Scala แต่ทั้งคู่ใช้อัลกอริทึมที่ซับซ้อนมากขึ้น
Sam Tobin-Hochstadt

0

คุณสามารถดูระบบประเภทสำหรับประเภทการตัดกันซึ่งสามารถให้สิ่งที่คุณต้องการa :: Int -> Int | Bool -> Boolเพื่อให้คุณรู้ว่ามีความเชี่ยวชาญสองอย่างIntและBoolเพียงพอหรือใช้การอนุมานประเภทปกติเพื่อสรุปประเภททั่วไปส่วนใหญ่ตามด้วยการวิเคราะห์โฟลว์การควบคุมเพื่อรวบรวมจริง อาร์กิวเมนต์ประเภท ในความเป็นจริงมีวิธีไฮบริด (CFA แสดงเป็นระบบชนิดและในทางกลับกัน)

งานวิจัยเกี่ยวกับประเภททั่วไปที่อนุมานน้อยที่สุดแทนที่จะเป็นประเภททั่วไปส่วนใหญ่อาจมีอยู่ แต่ฉันไม่รู้ตัว

สำหรับเทคนิคในการใช้ความหลากหลายมีสองวิธีแก้ปัญหา: 1) ความชำนาญพิเศษ (คิดว่าแม่แบบ C ++) 2) สมมติฐานการแทนค่าแบบเดียวกัน

สำหรับ 2 คุณไม่ต้องการประเภทจากไซต์การโทรในระหว่างการตรวจสอบชนิดและสามารถรองรับการรวบรวมแยกกันได้ง่ายขึ้น

โปรดทราบว่าเรากำลังพูดถึงตัวแปรหลากหลายที่นี่และการเรียกใช้เมธอดเสมือน OO นั้นเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงที่เรียกว่า polymorphism ชนิดย่อย โปรดทราบว่าเทมเพลต C ++ รองรับทั้งสิ่งต่าง ๆ เช่นพาราเมทริกโพลิมอร์ฟิซึมและการพิมพ์เป็ดซึ่งเป็นอีกรูปแบบหนึ่งของความหลากหลาย


1
"การเรียกใช้เมธอดเสมือน OO นั้นแตกต่างไปจากเดิมอย่างสิ้นเชิงเรียกว่า ad-hoc polymorphism" Ad-hoc polymorphism เป็นอีกชื่อหนึ่งของการโอเวอร์โหลด คุณดูเหมือนจะสับสนกับความหลากหลายย่อย
Radu GRIGore

แต่คลาสย่อยไม่จำเป็นต้องเป็นประเภทย่อยใช่ไหม เช่นสำหรับประเภทย่อย LSP ควรจะถือไว้
nponeccop

1
จริง แต่ข้างจุด "Subtype polymorphism" เป็นคำมาตรฐาน ดูen.wikipedia.org/wiki/Subtype_polymorphismสำหรับรายละเอียด
Radu GRIGore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.