2015-04-11 2 views
6

ОК, поэтому я провел весь день с докладом о языке Haskell (2010) и обнаружил всевозможные «интересные» кромки. Вещь, которая была бы у вас думаю должна быть ошибка, но которая фактически разрешена.Haskell Language Report: определение reservedid

В частности, рассмотрим следующий отрывок из лексической ссылки синтаксиса (раздел 10.2):

reservedid → case | class | data | default | deriving | do | else 
      | foreign | if | import | in | infix | infixl | 
      | infixr | instance | let | module | newtype | of 
      | then | type | where | _ 

Вы мощь ожидают увидеть qualified в этом списке & hellip; Но его нет. (Не является as или hiding, если на то пошло.)

Теперь мне интересно и hellip; Является ли это случайным наблюдением в Отчете? Или это преднамеренное дизайнерское решение?

Похоже, что GHC, по крайней мере, следует за буквой спецификации, поскольку она с радостью позволит вам определить переменную, имя которой, по сути, qualified. Странно, но верно. Таким образом, кажется, что это имя является только «особенным» в одном контексте. В отличие от этого, вы можете никогда имя переменная module. Мы могли бы сделать это слово особенным только в начале файла & hellip; но мы этого не сделали.

+0

Интересно, что StackOverflow не считает, что 'foreign' является ключевым словом ... (Обратите внимание, я не знаю, на каком языке он автоматически обнаруживается, поэтому ...) – MathematicalOrchid

ответ

8

qualified, as и hiding встречаются только в определенных местах как ключевые слова, поэтому их можно использовать как имена переменных.

  • qualified только возникает после import.
  • as происходит только после того, как import qualified PACKAGE
  • hiding происходит только после того, как import [qualified] PACKAGE [as NAME]

Я понимаю, что вы имеете в виду, когда вы указываете, что module может быть один из этих мест размещения конкретных ключевых слов, но это кажется нелогичным имя все module. Может быть, предыдущая версия Haskell допускает несколько модулей в одном файле?

Можно было бы сказать то же самое для qualified и hiding, но я использовал as много, например, так:

zip [] _ = [] 
zip _ [] = [] 
zip (a:as) (b:bs) = (a, b) : zip as bs 

Итак, имея это в виду, я думаю, что это действительно дизайнерское решение, один что я думаю, что многие языки * могут сделать с включением.

Возможно, стоит отметить, что deriving может быть одним из этих слов, поскольку он всегда следует декларации данных, а также foreign, поскольку он зарезервирован только с расширением FFI.


* особенно JavaScript, с его huge list of mainly pointless reserved words!

+1

Я часто пытаюсь использовать 'if' и' of' для in-file и out-file. Очевидно, что это терпит неудачу ... ;-) – MathematicalOrchid

+1

Это не так много, что они могут появляться только в определенных местах, но этот * * обычный * идентификатор может появляться в тех же местах. 'module',' deriving' и 'foreign' все ломаются. –

4

Во-первых, ключевые слова «как», «скрывать» и «квалифицировать» не были в первоначальном определении Haskell. Когда они были добавлены, они не были сделаны в зарезервированные слова ради обратной совместимости. Добавление зарезервированных слов - это верный способ разбить код. Это было очень преднамеренное решение.

Во-вторых, насколько я знаю, Haskell не запрещает несколько модулей на файл. Спецификация просто не говорит о файлах. (Но я не знаю о какой-либо реализации, которая позволяет это.)

+2

В частности, 'as' является множественным числом' a'. Я уверен, что кто-то использовал это. – MathematicalOrchid

Смежные вопросы