การอนุมานประเภท Hindley-Milner ใช้สำหรับระบบประเภท Hindley-Milner ซึ่งเป็นข้อ จำกัด ของระบบชนิด System-F คุณลักษณะที่น่าสนใจของ HM type systems คือพวกมันมีตัวแปรหลากหลาย (aka. generics) นั่นเป็นคุณลักษณะระบบที่ใหญ่ที่สุดเพียงอย่างเดียวที่ Golang ปฏิเสธ
ด้วยข้อ จำกัด ที่น่าผิดหวังการอนุมานประเภท HM เป็นไปไม่ได้ ลองดูโค้ดที่ไม่มีการพิมพ์:
func f(a) {
return a.method()
}
ประเภทf
ใด เราอาจสังเกตเห็นว่าจะต้องมีวิธีการเพื่อให้เราสามารถใช้อินเตอร์เฟซที่ไม่ระบุชื่อ:a
func f(a interface { method() ??? }) ???
อย่างไรก็ตามเราไม่ทราบว่าประเภทการส่งคืนคืออะไร ด้วยตัวแปรประเภทเราสามารถประกาศประเภทเป็น
func f[T](a interface{ method() T }) T
อย่างไรก็ตาม Go ไม่มีตัวแปรประเภทดังนั้นสิ่งนี้จะไม่ทำงาน ในขณะที่อินเทอร์เฟซโดยนัยทำให้การอนุมานของลักษณะง่ายขึ้นตอนนี้เราไม่มีวิธีค้นหาชนิดส่งคืนของการเรียกฟังก์ชัน HM-system ต้องการฟังก์ชั่นทั้งหมดที่จะประกาศมากกว่าที่จะบอกเป็นนัยและแต่ละชื่อสามารถมีได้เพียงประเภทเดียวเท่านั้น
แต่ต้องใช้ฟังก์ชันนั้นในการประกาศอย่างเต็มที่ แต่อนุญาตให้ตัวแปรใช้การอนุมานประเภท สิ่งนี้เป็นไปได้เพราะทางด้านขวามือของการบ้านvariable := expression
มีประเภทที่ทราบแล้ว ณ จุดนั้นของโปรแกรม การอนุมานประเภทนี้เป็นแบบง่ายถูกต้องและเป็นเส้น
- ชนิดของตัวแปรเป็นที่รู้จักกันทันที ณ จุดประกาศในขณะที่การอนุมาน HM จะต้องตรวจสอบโปรแกรมทั้งหมดก่อน สิ่งนี้มีผลกระทบต่อคุณภาพของข้อความแสดงข้อผิดพลาดเช่นกัน
- วิธีการอนุมาน Type ของ Go จะเลือกชนิดที่เจาะจงที่สุดสำหรับตัวแปรเสมอซึ่งตรงกันข้ามกับ HM ที่เลือกประเภททั่วไปมากที่สุด สิ่งนี้ทำงานได้อย่างสมบูรณ์กับการพิมพ์ย่อยแม้จะมีอินเตอร์เฟสแบบนัยของ Go