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