Почему я получаю ошибку синтаксического анализа при вводе ошибки '=' в Haskell, когда я все правильно выравниваю?

В настоящее время я изучаю Haskell с помощью онлайн-версии Learn You a Haskell, и я прохожу главу 4: Синтаксис в функциях. Просматривая книгу, я дословно кодирую все примеры функций в своем текстовом редакторе (Notepad++) и запускаю их в GHCI.

Самая последняя функция, которую я сделал, начинает меня раздражать (это в разделе «Стража, охрана!» Главы 4).

initials :: String -> String -> String
initials firstname lastname = [f] ++ "." ++ [l]
    where   (f:_) = firstname
            (l:_) = lastname

Это мой код, а также код, показанный в книге. Всякий раз, когда я пишу это сам, GCHI всегда выдает ошибку синтаксического анализа. Однако, когда я копирую/вставляю его из книги, он работает. Самое смешное, что нет никакой разницы. Я скопировал/вставил код поверх своего, и между ними не было буквально никакой разницы. Я делал это несколько раз, так что я уверен, что не заблуждаюсь.

Почему это происходит? Как я могу это исправить? Сначала я просмотрел его, но все, что я вижу, это то, что два утверждения после «где» должны быть выровнены в одном столбце. Я делаю это. Это все еще не работает.


person kullalok    schedule 05.06.2013    source источник
comment
Вставка кода поверх другого кода в Notepad++ — не лучший способ определить, идентичен ли он. Используйте инструменты, которые вычисляют и визуализируют разницу между двумя файлами, например Unix/GNU diff, или инструменты с графическим интерфейсом. Ваш компилятор Haskell, вероятно, не меняет того, как он анализирует входные данные в зависимости от времени суток или случайных источников; должна быть разница.   -  person Kaz    schedule 06.06.2013
comment
Вы используете вкладки? Если да, переключитесь на пробелы. Вкладки часто могут вызывать проблемы с компиляцией, даже если все выглядит правильно.   -  person Jeff Burka    schedule 06.06.2013
comment
Перейдите в «Настройки» > «Настройки», выберите вкладку Language Menu/Tab Settings, в правой полосе прокрутки выберите haskell, затем снимите флажок «Использовать значение по умолчанию» и установите флажок «Заменить пробелом». Обычно мне нравится иметь размер вкладки равным 2. Это изменит его, поэтому при автоматическом отступе будут использоваться пробелы.   -  person paul    schedule 06.06.2013
comment
В источнике, который вы вставили, определенно есть вкладки. Я не понимаю, почему GHC просто не делает их синтаксической ошибкой.   -  person Carl    schedule 06.06.2013
comment
Если вы нажмете кнопку абзаца на панели инструментов в Notepad++, она покажет вам, какие символы используются в вашем документе. Пробелы показаны маленькими оранжевыми точками, вкладки — маленькими оранжевыми стрелками. Это должно помочь вам увидеть, где находятся вкладки.   -  person paul    schedule 06.06.2013
comment
Спасибо @paul за ваш первый комментарий. Теперь это работает :)   -  person kullalok    schedule 06.06.2013


Ответы (1)


Может быть, вы используете табуляцию и делаете это непоследовательно (т. е. используете табуляцию в одних строках и пробелы в других)?

В отчете Haskell говорится:

  • Позиции табуляции разделены 8 символами.
  • Символ табуляции вызывает вставку достаточного количества пробелов для выравнивания текущей позиции со следующей позицией табуляции.

Настоятельно рекомендуется никогда не использовать вкладки и всегда использовать пробелы!

person Stefan Holdermans    schedule 05.06.2013