2016-02-08 3 views
0

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

> 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. 

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

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 и where в вышеуказанных случаях?

+14

Ваш размещенный код смешивает вкладки и пробелы, GHC обрабатывает вкладки как 8 пробелов, и это прерывает отступ. Я рекомендую включить предупреждения '-Wall', чтобы это сообщалось компилятором, поэтому вы знаете, что что-то не так. Простое решение - избежать вкладок. Для получения дополнительных решений см. Http://dmwit.com/tabs/ – chi

+1

** Никогда ** смешивайте вкладки и пробелы. Он разбивает код на всех языках, где отступы значительны. Проверьте настройки редактора и всегда используйте только вкладки или только пробелы (последнее обычно предпочтительнее). – Bakuriu

+0

И для записи эти примеры, отображаемые на StackOverflow, имеют точно правильный макет и синтаксис. –

ответ

2

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

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

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

{-# OPTIONS -Wall #-} 

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

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

Смежные вопросы