Чи може висновок Хіндлі-Мілнера працювати для мови Go?


22

Я читав, що Hindley-Milner не працює з типами систем, які мають підкласи, і є інші функції системи, які також не працюють з цим. Наразі Go має лише дуже обмежений тип висновку в :=операторі. Але у Go немає підкласів у традиційному розумінні, лише інтерфейси, які дуже схожі на типи класів Haskell, які добре працюють із висновками Хіндлі-Мілнера.

Отже, чи може висновок Хіндлі-Мілнера працювати в принципі для Go так само, як це стосується Haskell? Або у Go є інші функції, які її порушують? (З іншого боку, Haskell також має деякі функції, які не працюють із Hindly-Milner, якщо ви користуєтесь тими, до яких потрібно вручну ввести ці частини програми.)

Відповіді:


35

Висновок типу Хіндлі-Мілнер використовується для систем типу Хіндлі-Мілнера, обмеження систем типу 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.

24
@bishop Це "аргументовано" для нескінченно малих значень "розуму".
варення

18
@bishop Виконавши роботу з компілятора мовами з генерикою, я, безумовно, можу погодитися: це важко реалізувати без істотного ускладнення реалізації. Я б пішов так далеко, щоб навіть замінити "важке" на "неможливо". Однак це не суть; справа в тому, чи варто додаткового ускладнення? І відповідь кожному, хто працював із дженериками та без них, очевидно, "так, безумовно!" Мені б від усієї думки погодитись із твердженням, що відмова від впровадження генерики тому, що "о ні, складність" є ідіотичною.
Мейсон Уілер

18
Це також, чому Go devs роблять вигляд, що FP різного роду поганий; Go має функцію першого класу з лексичним закриттям, і з тим , що здатність створювати функції вищого порядку, але це неможливо , щоб помістити їх в будь - яких хорошому застосування , так як типи таких основних функцій , як map, filterі reduceвсе невимовні в Гоу дуже обмежена тип системи.
варення

9
@hobbs And Go могла б бути справді приємною мовою, якби це було виправлено, але натомість люди повинні писати бібліотеки із загальним поколінням на кшталт gengenтаgonerics
cat

14
@cat Соромно. Спочатку Go здається чудовою мовою, сповненою чудових ідей, але потім ти розумієш, що у неї немає спадщини та поліморфізму, тому ти не можеш робити OOP добре, і в ній немає дженериків, тому ти не можеш робити FP добре, і ти Ви ліво дивлячись на екран із запитанням "тоді як саме Ви повинні використовувати цю мову?!?"
Мейсон Уілер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.