W artykule Erica Lipperta Co słychać w notacji węgierskiej? , twierdzi, że celem notacji węgierskiej (dobrego rodzaju) jest:
rozwinąć pojęcie „typu”, tak aby obejmowało informacje semantyczne oprócz informacji o reprezentacji pamięci.
Prostym przykładem może być przedrostek zmiennej reprezentującej współrzędną X z „x” i zmiennej reprezentującej współrzędną Y z „y”, niezależnie od tego, czy zmienne te są liczbami całkowitymi, zmiennoprzecinkowymi lub czymkolwiek innym, tak aby podczas przypadkowego zapisu xFoo + yBar
, kod wyraźnie wygląda źle.
Ale czytałem również o systemie typów Haskell i wydaje się, że w Haskell można osiągnąć to samo (tj. „Rozszerzyć pojęcie typu, aby objąć informacje semantyczne”), używając rzeczywistych typów, które kompilator sprawdzi dla ciebie. Tak więc w powyższym przykładzie xFoo + yBar
w Haskell nie udało się skompilować, jeśli poprawnie zaprojektowałeś swój program, ponieważ zostałyby zadeklarowane jako typy niezgodne. Innymi słowy, wydaje się, że system typów Haskell skutecznie obsługuje sprawdzanie czasu kompilacji równoważne notacji węgierskiej
Czy zatem notacja węgierska jest jedynie pomocą dla języków programowania, których systemy typów nie mogą kodować informacji semantycznych? Czy też notacja węgierska oferuje coś więcej niż system statyczny, taki jak Haskell?
(Oczywiście używam Haskell jako przykładu. Jestem pewien, że istnieją inne języki z podobnie ekspresyjnymi (bogatymi? Silnymi?) Systemami typu, chociaż nie spotkałem żadnego.)
Żeby było jasne, nie mówię o adnotowaniu nazw zmiennych typem danych , ale raczej o informacji o znaczeniu zmiennej w kontekście programu. Na przykład zmienna może być liczbą całkowitą, liczbą zmiennoprzecinkową, podwójną lub długą, lub czymkolwiek, ale może znaczenie zmiennej jest takie, że jest to względna współrzędna x mierzona w calach. Tego rodzaju informacje mówię o kodowaniu za pomocą notacji węgierskiej (i typów Haskell).