Правильный синтаксис предложений let in и where в Haskell

Я пытаюсь объявить локальные переменные (это правильный термин в случае haskell?) в haskell, используя предложения where и let-in. Однако всякий раз, когда мои предложения длиннее одной строки, я всегда получаю некоторые ошибки синтаксического анализа:

> letExample :: Int -> Int
> letExample 0 = 0
> letExample n =
>               let one     = 1
>                   four    = 4
>                   eight   = 8
>               in one*four*eight

При попытке загрузить приведенный выше код в ghci я получаю следующую ошибку:

letexample.lhs:4:33:
parse error in let binding: missing required 'in' Failed, modules loaded: none.

Я получаю следующую ошибку при попытке загрузить код ниже:

whereexample:5:57: parse error on input ‘=’
Failed, modules loaded: none.

код:

> whereExample :: Int -> Int
> whereExample 0 = 0
> whereExample n = one * four * eight
>               where   one     = 1
>                       four    = 4
>                       eight   = 8

Как правильно использовать let и где в приведенных выше случаях?


person gen    schedule 08.02.2016    source источник
comment
Ваш опубликованный код смешивает вкладки и пробелы, GHC рассматривает вкладки как 8 пробелов, и это нарушает отступы. Я рекомендую включить предупреждения -Wall, чтобы компилятор сообщил об этом, чтобы вы знали, что что-то не так. Простое решение — избегать вкладок. Дополнительные решения см. на странице dmwit.com/tabs.   -  person chi    schedule 08.02.2016
comment
Никогда не смешивайте табуляции и пробелы. Он разбивает код на всех языках, где важны отступы. Проверьте настройки редактора и всегда используйте только табуляции или только пробелы (последнее обычно предпочтительнее).   -  person Bakuriu    schedule 08.02.2016
comment
И для справки, эти примеры, отображаемые на StackOverflow, имеют точно правильную компоновку и синтаксис.   -  person Reid Barton    schedule 08.02.2016
comment
И правильный термин - привязки, а не переменные.   -  person lehins    schedule 09.02.2016
comment
спасибо @АлексейКулешевич   -  person gen    schedule 09.02.2016
comment
@chi, можешь опубликовать свой комментарий в качестве ответа? Это решило мою проблему...   -  person gen    schedule 11.02.2016
comment
С переменными тоже все в порядке.   -  person dfeuer    schedule 11.02.2016


Ответы (1)


Размещенный код смешивает вкладки и пробелы. Это частая причина проблем с отступами.

В отчете Haskell, определяющем язык, говорится, что вкладки эквивалентны 8 пробелам. Если ваш редактор настроен на отображение табуляции в виде другого количества пробелов, есть вероятность, что то, что вы читаете с отступом на правильном уровне, на самом деле не так для компилятора.

Самое простое решение — заменить табуляцию пробелами в исходных файлах. Для этого я рекомендую включить предупреждения, передающие флаг -Wall, или добавив

{-# OPTIONS -Wall #-}

в начале ваших исходных файлов. Это приведет к тому, что GHC будет предупреждать об обнаружении вкладок.

Также существуют альтернативные решения радикальному удалению всех вкладок. Существуют разумные способы смешивания табуляции и пробелов «независимым от табуляции» способом, который сделает код компилируемым и читаемым, несмотря на то, сколько пробелов эквивалентно табуляции. Хотя это не очень популярно, такие предложения имеют свои технические достоинства.

person chi    schedule 11.02.2016