2013-05-08 3 views
0

В Learn You a Haskell есть тип образец Enum:синтаксис диапазона списка Haskell

data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday 
      deriving (Eq, Ord, Show, Read, Bounded, Enum) 

, но когда я пытаюсь получить список Day с использованием синтаксиса диапазона без пробелов граничащих Конструкторов значений я получаю следующее сообщение об ошибке:

ghci> [Thursday..Sunday] 

<interactive>:30:2: 
    Failed to load interface for `Thursday' 
    Use -v to see a list of the files searched for. 

<interactive>:30:2: 
    A section must be enclosed in parentheses thus: (Thursday.. Sunday) 

Когда я использую пробельные все работает:

ghci> [Thursday .. Sunday] 
[Thursday,Friday,Saturday,Sunday] 

В чем причина такого поведения (например, диапазоны для Int s не требуют пробелов)?

+1

tl; dr: 'Thursday' интерпретируется как имя модуля при использовании' Thursday.' – soulcheck

+0

Язык _enforcing_ хороший стиль, довольно редкое явление. Не помещать пробелы вокруг '..' ** уродливо **. Я сжимаю каждый раз, когда вижу это. –

ответ

2

На самом деле я не мог найти правило для этого в Haskell syntax, но вот обоснованное предположение.

Точка также является оператором, который отделяет имена модулей от идентификаторов, как в Prelude.id, поэтому грамматика, вероятно, была бы двусмысленной или, по крайней мере, более сложной для анализа, если бы были разрешены Monday..Sunday. Исключение делается для чисел, потому что они являются особенными в любом случае; точка может быть частью числового литерала, а имя модуля не может быть числовым литералом.

+2

Номера не начинаются с прописной буквы, поэтому нет никакой двусмысленности, так как имя модуля должно начинаться с одного. –

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