От языка Haskell 98 мы видим основное различие в токенах идентификаторов в Haskell:
varid -> (small {small | large | digit | ' })<reservedid>
conid -> large {small | large | digit | ' }
То есть язык принципиально различает имена переменных ("varid") из имен конструкторов ("conid"), на всех уровнях языка (как переменные, так и переменные значения и конструкторы).Совершенно ясно, что Haskell различает идентификаторы на два основных пространства имен (ну, есть и другие, если вы считаете модули и классы), но два основных: те, которые начинаются со строчной буквы (идентификаторы переменных), и те, которые начинаются с верхнего-символ (идентификаторы конструктора).
Итак, учитывая, что мы делаем , чтобы отличать конструкторы от переменных, возникает вопрос «почему?».
Чтение типов
Один правдоподобный аргумент в том, что он позволяет очень просто определить параметров в типах (например, полиморфных типах).
Сопоставление с образцом
Во-вторых, и что более важно, у нас есть единый синтаксис для построения и деконструкции данных (сопоставление с образцом).Всякий раз, когда вы видите в шаблоне верхний регистр,
case x of
Foo y z -> ...
Вы знаете , что Foo
- это структура данных, которая разбирается на части, и ее компоненты называются.Соответственно, всякий раз, когда вы видите верхний регистр в выражении,
g (f (Foo 1 2)
вы знаете , что f
получает недавно построенный тип данных Foo
с двумя аргументами.
Итак, поскольку конструкторы (и тип, и значение) так важны в языке, это простое ограничение на идентификаторы в верхнем регистре значительно упрощает понимание человеком того, что происходит в фрагменте кода.В некоторых отношениях заглавные буквы восполняют отсутствие других синтаксических шумов в языке, что помогает читателю.
Пространства имен
В Haskell существует шесть видов имен: имена переменных и конструкторов обозначают значения;те для переменных типа, конструкторов типов и классов типов относятся к объектам, связанным с системой типов;и имена модулей относятся к модулям.Существуют два ограничения именования:
Имена переменных и переменных типов - это идентификаторы, начинающиеся со строчных букв или подчеркивания;остальные четыре вида имен являются идентификаторами, начинающимися с заглавных букв.Идентификатор не должен использоваться в качестве имени конструктора типа и класса в одной и той же области видимости.Это единственные ограничения;например, Int может быть одновременно именем модуля, класса и конструктора в одной области видимости.
Haskell B
В Haskell B конструкторыи переменные могут использовать любой регистр.