Правильный синтаксис предложений 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 и где в вышеуказанных случаях?

1 ответ

Решение

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

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

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

{-# OPTIONS -Wall #-}

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

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

Другие вопросы по тегам