โชคไม่ดีที่วรรณกรรมในเรื่องนี้มีเนื้อหาหนาแน่นมาก ฉันก็อยู่ในรองเท้าของคุณเช่นกัน ฉันได้รับการแนะนำครั้งแรกในหัวข้อนี้จาก Programming Languages: Applications and Interpretation
http://www.plai.org/
ฉันจะพยายามสรุปแนวคิดเชิงนามธรรมตามด้วยรายละเอียดที่ฉันไม่พบชัดเจนในทันที ประการแรกการอนุมานประเภทสามารถคิดได้จากการสร้างแล้วจึงแก้ข้อ จำกัด ในการสร้างข้อ จำกัด คุณเรียกคืนโครงสร้างไวยากรณ์และสร้างข้อ จำกัด อย่างน้อยหนึ่งข้อในแต่ละโหนด ตัวอย่างเช่นถ้าโหนดเป็นตัว+ดำเนินการตัวถูกดำเนินการและผลลัพธ์ทั้งหมดจะต้องเป็นตัวเลข โหนดที่ใช้ฟังก์ชันมีประเภทเดียวกันกับผลลัพธ์ของฟังก์ชันและอื่น ๆ
สำหรับภาษาที่ไม่มีletคุณสามารถแก้ข้อ จำกัด ข้างต้นแบบสุ่มสี่สุ่มห้าได้โดยการแทนที่ ตัวอย่างเช่น:
(if (= 1 2)
1
2)
ในที่นี้เราสามารถพูดได้ว่าเงื่อนไขของคำสั่ง if ต้องเป็นบูลีนและประเภทของคำสั่ง if นั้นเหมือนกับประเภทของคำสั่งthenและelseประโยค เนื่องจากเรารู้1และ2เป็นตัวเลขโดยการแทนที่เราจึงรู้ว่าifคำสั่งคือตัวเลข
สิ่งที่น่ารังเกียจและสิ่งที่ฉันไม่เข้าใจมาระยะหนึ่งคือการจัดการกับให้:
(let ((id (lambda (x) x)))
(id id))
ที่นี่เราผูกไว้idกับฟังก์ชันที่ส่งคืนสิ่งที่คุณส่งผ่านหรือที่เรียกว่าฟังก์ชันเอกลักษณ์ ปัญหาคือประเภทของพารามิเตอร์ของฟังก์ชันที่มีความแตกต่างกับการใช้งานของแต่ละx idประการที่สองidคือฟังก์ชันประเภทa -> aที่aสามารถเป็นอะไรก็ได้ (a -> a) -> (a -> a)ครั้งแรกเป็นประเภท สิ่งนี้เรียกว่า let-polymorphism กุญแจสำคัญคือการแก้ข้อ จำกัด ตามลำดับที่กำหนด: ก่อนอื่นให้แก้ข้อ จำกัด สำหรับคำจำกัดความของid. a -> aนี้จะเป็น จากนั้นสดสำเนาแยกต่างหากจากประเภทของidสามารถทดแทนเข้าไปในข้อ จำกัด สำหรับแต่ละสถานที่idจะใช้สำหรับตัวอย่างและa2 -> a2a3 -> a3
สิ่งนี้ไม่สามารถอธิบายได้ในแหล่งข้อมูลออนไลน์ พวกเขาจะพูดถึงอัลกอริทึม W หรือ M แต่ไม่ใช่วิธีการทำงานในแง่ของการแก้ข้อ จำกัด หรือทำไมมันถึงไม่ barf เกี่ยวกับความหลากหลายของตัวอักษร: แต่ละอัลกอริทึมเหล่านั้นบังคับใช้คำสั่งในการแก้ข้อ จำกัด
ฉันพบว่าแหล่งข้อมูลนี้มีประโยชน์อย่างมากในการผูก Algorithm W, M และแนวคิดทั่วไปของการสร้างข้อ จำกัด และการแก้ปัญหาทั้งหมดเข้าด้วยกัน มีความหนาแน่นเล็กน้อย แต่ดีกว่ามาก:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
เอกสารอื่น ๆ อีกมากมายก็ดีเช่นกัน:
http://people.cs.uu.nl/bastiaan/papers.html
ฉันหวังว่าจะช่วยชี้แจงโลกที่ค่อนข้างมืดมน