Czy wnioskowanie Hindley-Milner może działać w języku Go?

22

Czytałem, że Hindley-Milner nie działa z systemami typów, które mają podklasy, i istnieją inne funkcje systemu typów, które również nie działają z nim dobrze. Go ma obecnie bardzo ograniczone wnioskowanie o typach u :=operatora. Ale Go nie ma podklas w tradycyjnym sensie, tylko interfejsy, które wyglądają bardzo podobnie do klas typu Haskell, które działają dobrze z wnioskowaniem Hindleya-Milnera.

Czy zatem wnioskowanie Hindley-Milner może zasadniczo działać w przypadku Go w ten sam sposób, co w przypadku Haskella? Czy też Go ma inne funkcje, które go psują? (Z drugiej strony, Haskell ma również pewne funkcje, które nie działają z Hindly-Milner, jeśli używasz tych, musisz ręcznie wpisać te części swojego programu.)

JanKanis
źródło

Odpowiedzi:

35

Wnioskowanie o typie Hindleya-Milnera stosuje się w systemach typu Hindley-Milner, ograniczenie systemów typu System-F. Interesującą cechą systemów typu HM jest to, że mają parametryczny polimorfizm (inaczej generyczne). Jest to jedna z największych funkcji systemu typów, której Golang odmawia.

Przy tym frustrującym ograniczeniu wnioskowanie typu HM jest niemożliwe. Spójrzmy na nietypowy kod:

func f(a) {
  return a.method()
}

Jaki to rodzaj f? Możemy zauważyć, że amusi mieć metodę, więc możemy użyć anonimowego interfejsu: func f(a interface { method() ??? }) ???. Nie mamy jednak pojęcia, jaki jest typ zwrotu. Za pomocą zmiennych typu możemy zadeklarować typ jako

func f[T](a interface{ method() T }) T

Jednak Go nie ma zmiennych typu, więc to nie zadziała. Chociaż niejawne interfejsy ułatwiają niektóre aspekty wnioskowania o typie, nie mamy obecnie sposobu na znalezienie typu zwracanego wywołania funkcji. System HM wymaga, aby wszystkie funkcje były deklarowane, a nie sugerowane, a każda nazwa może mieć tylko jeden typ (podczas gdy metody Go mogą mieć różne typy w różnych interfejsach).

Zamiast tego Go wymaga, aby funkcje były zawsze w pełni deklarowane, ale zezwala zmiennym na używanie wnioskowania typu. Jest to możliwe, ponieważ prawa strona przypisania variable := expressionma już znany typ w tym momencie programu. Tego rodzaju wnioskowanie o typach jest proste, poprawne i liniowe.

  • Typ zmiennej jest natychmiast znany w punkcie deklaracji, podczas gdy wnioskowanie HM musi najpierw potencjalnie sprawdzić typ całego programu. Ma to również zauważalny wpływ na jakość komunikatów o błędach.
  • Metoda wnioskowania typu Go zawsze wybierze najbardziej specyficzny typ zmiennej, w przeciwieństwie do HM, który wybiera najbardziej ogólny typ. To działa czysto z podsieciami, nawet z niejawnymi interfejsami Go.
amon
źródło
24
@bishop Jest „uzasadniony” dla nieskończenie małych wartości „rozumu”.
hobbs
18
@bishop Po ukończeniu pracy kompilatora w językach z generycznymi, z pewnością mogę się zgodzić: trudno jest wdrożyć bez znacznego komplikowania wdrożenia. Posunąłbym się tak daleko, że nawet „trudne” zastąpiłoby „niemożliwe”. Nie o to jednak chodzi; Chodzi o to, czy warto dodatkowych komplikacji? Odpowiedź dla każdego, kto pracował z lekami generycznymi i bez nich, brzmi oczywiście „tak, zdecydowanie!” Musiałbym całym sercem zgodzić się z twierdzeniem, że odmowa wdrożenia leków generycznych, ponieważ „och nie, złożoność” jest idiotyczna.
Mason Wheeler,
18
Dlatego też deweloperzy Go udają, że wszelkiego rodzaju FP jest zły; Go ma pierwszorzędne funkcje z leksykalnym zamknięciem, a tym samym możliwość tworzenia funkcji wyższego rzędu, ale nie można ich dobrze wykorzystać, ponieważ rodzaje podstawowych funkcji map, takich jak filter, i reducewszystkie są niewyrażalne w obrębie bardzo ograniczonego Go system typów.
hobbs
9
@hobbs and Go może być naprawdę ładny język, jeżeli zostały ustalone, lecz ludzie muszą pisać bibliotek generic generacji, jak gengenigonerics
kot
14
@cat To wstyd. Na początku Go wydaje się świetnym językiem pełnym świetnych pomysłów, ale potem zdajesz sobie sprawę, że nie ma on dziedziczenia i polimorfizmu, więc nie możesz dobrze robić OOP i nie ma żadnych ogólnych, więc nie możesz dobrze robić FP, a ty wpatruje się tępo w ekran pytając „to w jaki sposób powinieneś używać tego języka?!?”
Mason Wheeler,