У статті Еріка Ліпперта Що відбувається з угорською нотацією? , він заявляє, що метою угорської нотації (доброго роду) є
розширити поняття "тип", щоб охопити смислову інформацію на додаток до інформації про представлення на зберігання.
Простим прикладом може бути префіксація змінної, яка представляє координату X з "x" та змінну, яка представляє Y-координату з "y", незалежно від того, чи є ці змінні цілими чи плаваючими чи будь-якими іншими, так що, коли ви випадково пишете xFoo + yBar
, код явно виглядає неправильно.
Але я також читав про систему типів Haskell, і, схоже, в Haskell можна зробити те саме (тобто "розширити поняття типу, щоб охопити смислову інформацію"), використовуючи фактичні типи, які компілятор перевірить для вас. Так, у наведеному вище прикладі, xFoo + yBar
в Haskell насправді не вдалося б компілювати, якщо ви правильно спроектували свою програму, оскільки вони будуть оголошені як несумісні типи. Іншими словами, схоже, що система типу Haskell ефективно підтримує перевірку часу компіляції, еквівалентну угорській нотації
Отже, чи угорська нотація є лише смугою допомоги для мов програмування, системи типу яких не можуть кодувати семантичну інформацію? Або Угорська нотація пропонує щось поза тим, що може запропонувати система статичного типу, така як Haskell?
(Звичайно, я використовую Haskell в якості прикладу. Я впевнений, що існують інші мови з подібними експресивними (багатими? Сильними?) Системами типу, хоча я не зустрічав жодної.)
Щоб було зрозуміло, я не говорю про анотування імен змінних з типом даних , а про інформацію про значення змінної в контексті програми. Наприклад, змінна може бути цілим чи поплавковим чи подвійним чи довгим чи будь-яким іншим, але, можливо, сенс змінної полягає в тому, що це відносна x-координата, виміряна в дюймах. Це така інформація, яку я говорю про кодування за допомогою угорської нотації (і через типи Haskell).