Почему диапазон Haskell требует пробелов при использовании [LT.. GT]?
Почему это происходит, когда я занимаюсь в Haskell, это работает:
[LT .. GT]
но это не так:
[LT..GT]
и что означает эта критическая ошибка:
<interactive>:1:2:
Failed to load interface for `LT':
Use -v to see a list of the files searched for.
<interactive>:1:2:
A section must be enclosed in parentheses thus: (`LT..` GT)
Однако, когда я использую Ints, вторая форма (без пробелов) работает:
[1..3]
Ответы
Ответ 1
Это потому, что LT..
интерпретируется как оператор .
в модуле LT
.
<interactive>:1:2:
Failed to load interface for `LT':
Use -v to see a list of the files searched for.
Это означает, что GHC не может найти модуль с именем LT
. Это же сообщение появляется, если вы используете квалифицированное имя с несуществующей библиотекой:
Prelude> SDJKASD.sdfhj
<interactive>:1:1:
Failed to load interface for `SDJKASD':
Use -v to see a list of the files searched for.
<interactive>:1:2:
A section must be enclosed in parentheses thus: (`LT..` GT)
В Haskell раздел - это инфиксный оператор с частичным приложением, например. (* 3)
, что эквивалентно \x -> x * 3
.
В вашем случае LT..
интерпретируется как оператор infix .
, а GT
является частью раздела, сформированного с помощью этого оператора.
Раздел должен быть заключен в круглые скобки, а поскольку неверное истолкование не выполняется, синтаксический анализатор будет жаловаться так.
Другой пример ошибки:
Prelude> [* 3]
<interactive>:1:2:
A section must be enclosed in parentheses thus: (* 3)
Ответ 2
Из-за максимального правила munch LT..
интерпретируется как квалифицированное имя оператора (.)
в модуле LT
. Поскольку вы можете определить своих собственных операторов в Haskell, этот язык позволяет полностью квалифицировать имена операторов так же, как вы можете, с помощью функций.
Это приводит к двусмысленности с ..
, используемой в диапазонах, когда имя оператора начинается с .
, которое разрешается с помощью правила максимального munch, в котором говорится, что выигрывает самое длинное совпадение.
Например, Prelude..
- это квалифицированное имя оператора композиции функций.
> :info Prelude..
(.) :: (b -> c) -> (a -> b) -> a -> c -- Defined in GHC.Base
infixr 9 .
> (+3) Prelude.. (*2) $ 42
87
Причина, по которой работает [1..3]
или [x..y]
, заключается в том, что имя модуля должно начинаться с буквы верхнего регистра, поэтому 1..
и x..
не могут быть квалифицированными именами.
Ответ 3
Не удалось загрузить интерфейс для `LT ':
Кенни и Хаммар объяснили, что это означает: LT..
считается функцией .
в модуле LT
. Поскольку модуль LT
отсутствует, ваш интерпретатор, естественно, не может его загрузить.
Раздел должен быть заключен в круглые скобки, таким образом: (LT..
GT)
В том же духе, предполагая, что LT..
является ссылкой на функцию .
в модуле LT
, ваш интерпретатор, по-видимому, предполагает, что вы допустили ошибку, используя квадратные скобки вместо parens, чтобы "раздел" (раздел, например, (+1)
).
Это просто неприятная маленькая бородавка на языке Хаскелла; просто не забудьте использовать пробелы.