Подтвердить что ты не робот

Почему диапазон 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]
4b9b3361

Ответ 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)).

Это просто неприятная маленькая бородавка на языке Хаскелла; просто не забудьте использовать пробелы.