В статье Эрика Липперта Что случилось с венгерской нотацией? Он заявляет, что цель Венгерской нотации (хороший вид) состоит в том, чтобы
расширить понятие «тип», чтобы охватить семантическую информацию в дополнение к информации представления представления.
Простым примером будет префикс переменной, представляющей X-координату с «x», и переменной, представляющей Y-координату с «y», независимо от того, являются ли эти переменные целыми числами или числами с плавающей запятой или чем-то еще, так что при случайной записи xFoo + yBar
код явно выглядит неправильно.
Но я также читал о системе типов Haskell, и кажется, что в Haskell можно сделать то же самое (то есть «расширить концепцию типа, чтобы охватить семантическую информацию»), используя фактические типы, которые компилятор проверит для вас. Таким образом, в приведенном выше примере xFoo + yBar
в Haskell будет невозможно выполнить компиляцию, если вы правильно разработали свою программу, поскольку они будут объявлены как несовместимые типы. Другими словами, похоже, что система типов Haskell эффективно поддерживает проверку во время компиляции, эквивалентную венгерской нотации
Итак, является ли венгерская нотация просто вспомогательным средством для языков программирования, чьи системы типов не могут кодировать семантическую информацию? Или венгерская нотация предлагает нечто помимо того, что может предложить статическая система типов, такая как Haskell?
(Конечно, я использую Haskell в качестве примера. Я уверен, что есть другие языки с аналогично выразительными (rich? Strong?) Системами типов, хотя я не сталкивался ни с какими.)
Чтобы было ясно, я говорю не о том, чтобы аннотировать имена переменных с типом данных , а скорее о информации о значении переменной в контексте программы. Например, переменная может быть целым числом или числом с плавающей запятой, двойным или длинным или любым другим, но, возможно, значение переменной заключается в том, что это относительная x-координата, измеренная в дюймах. Это та информация, о которой я говорю, о кодировании через венгерскую нотацию (и через типы Haskell).