Suy luận kiểu Hindley-Milner được sử dụng cho các hệ thống loại Hindley-Milner, một hạn chế của hệ thống loại System-F. Đặc điểm thú vị của các hệ thống loại HM là chúng có tính đa hình tham số (hay còn gọi là thuốc generic). Đó là tính năng hệ thống loại lớn nhất mà Golang từ chối có.
Với sự hạn chế bực bội đó, suy luận kiểu kiểu HM là không thể. Chúng ta hãy xem mã chưa được kiểm tra:
func f(a) {
return a.method()
}
Các loại là f
gì? Chúng tôi có thể nhận thấy rằng a
phải có một phương thức, vì vậy chúng tôi có thể sử dụng giao diện ẩn danh : func f(a interface { method() ??? }) ???
. Tuy nhiên, chúng tôi không có ý tưởng gì về kiểu trả về. Với các biến kiểu, chúng ta có thể khai báo kiểu như
func f[T](a interface{ method() T }) T
Tuy nhiên, Go không có biến loại nên điều này sẽ không hoạt động. Mặc dù các giao diện ngầm làm cho một số khía cạnh của suy luận kiểu dễ dàng hơn, bây giờ chúng ta không có cách nào để tìm ra kiểu trả về của một lệnh gọi hàm. Hệ thống HM yêu cầu tất cả các hàm phải được khai báo thay vì được ngụ ý và mỗi tên chỉ có thể có một loại duy nhất (trong khi các phương thức của Go có thể có các loại khác nhau trong các giao diện khác nhau).
Thay vào đó, Go yêu cầu các hàm luôn được khai báo đầy đủ, nhưng cho phép các biến sử dụng suy luận kiểu. Điều này là có thể bởi vì phía bên phải của một bài tập variable := expression
đã có một loại đã biết tại thời điểm đó của chương trình. Kiểu suy luận kiểu này là đơn giản, chính xác và tuyến tính.
- Loại của một biến được biết ngay lập tức tại điểm khai báo, trong khi suy luận của HM phải kiểm tra loại toàn bộ chương trình trước. Điều này cũng có tác động đáng kể đến chất lượng của các thông báo lỗi.
- Cách tiếp cận suy luận kiểu Go sẽ luôn chọn loại cụ thể nhất cho một biến, ngược lại với HM chọn loại chung nhất. Điều này hoạt động rõ ràng với phân nhóm, ngay cả với các giao diện ngầm của Go.