Висновок типу Хіндлі-Мілнер використовується для систем типу Хіндлі-Мілнера, обмеження систем типу F-F. Цікавою особливістю систем типу HM є те, що вони мають параметричний поліморфізм (ака. Generics). Це єдина найбільша системна особливість типу, яку Голанг відмовляється мати.
З таким розчарувальним обмеженням, висновок типу HM неможливий. Давайте розглянемо нетипізований код:
func f(a) {
return a.method()
}
Який тип f
? Ми могли б помітити , що a
повинен мати метод, щоб ми могли використовувати анонімний інтерфейс: func f(a interface { method() ??? }) ???
. Однак ми не маємо поняття, що таке тип повернення. За допомогою змінних типів ми могли б оголосити тип як
func f[T](a interface{ method() T }) T
Однак у Go немає змінних типів, тому це не працюватиме. Хоча неявні інтерфейси полегшують деякі аспекти виводу типу, тепер у нас немає способу з'ясувати тип повернення функціонального виклику. HM-система вимагає декларувати всі функції, а не мати на увазі, і кожне ім’я може мати лише один тип (тоді як методи Go можуть мати різні типи в різних інтерфейсах).
Натомість Go вимагає, щоб функції завжди були повністю оголошені, але дозволяє змінним використовувати умовивід типу. Це можливо, тому що права частина завдання variable := expression
вже має відомий тип у цій точці програми. Цей вид виводу типу простий, правильний та лінійний.
- Тип змінної негайно відомий у точці декларації, тоді як висновок HM повинен потенційно перевірити всю програму спочатку. Це помітно впливає і на якість повідомлень про помилки.
- Підхід виводу типу Go завжди вибирає найбільш певний тип змінної, на відміну від HM, який вибирає найбільш загальний тип. Це чітко працює з підтипом, навіть із неявними інтерфейсами Go.