Ошибка Haskell: ошибка разбора на входе `= ' - PullRequest
7 голосов
/ 09 августа 2010

Характеристики

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Проблема

У меня проблемы с использованием синтаксиса let.Следующий код отказывается компилировать:

module Main where

main = let x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z

Я пробовал табуляции в y = 2 и z = 3 еще больше.Никаких кубиков.

(нежелательно) Решения

Единственный способ получить код для компиляции - это либо

  1. Замена жестких вкладокс пробелами.
  2. Замена предложения let на предложение where.

Ответы [ 5 ]

16 голосов
/ 09 августа 2010

Сайзан на #haskell объясняет, что назначения в выражении let должны быть выровнены, а не let . Пока назначения совпадают, можно использовать жесткие вкладки или программные вкладки.

Правильный код:

module Main where

main = let
        x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
11 голосов
/ 09 августа 2010

Вы просто не можете правильно контролировать отступ с помощью вкладок, потому что размер вкладки не определен.

Поэтому не используйте вкладки в Haskell. Они злые.

3 голосов
/ 09 августа 2010

Отступать каждое объявление в блоке let в той же степени.Также хорошей формой является отступ «in» и «let» на одном уровне.Например.

main = let x = 1
           y = 2
           z = 3
       in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
2 голосов
/ 09 июля 2012

Лично я ставлю точку с запятой в конце каждой строки

module Main where

main = let x = 1 ;
           y = 2 ;
           z = 3 
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
1 голос
/ 09 августа 2010

Если вы настаиваете на символах TAB в вашем источнике, компилируются следующие компоненты:

module Main where

main =
    let x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z

, где все начальные пробелы - это один или два TAB, а также пробелы между let и x = 1табуляцияПросмотр в режиме списка vi , чтобы сделать табуляции и концы строк явными:

module Main where<b>$</b>
<b>$</b>
main =<b>$</b>
<b>^I</b>let<b>^I</b>x = 1<b>$</b>
<b>^I^I</b>y = 2<b>$</b>
<b>^I^I</b>z = 3<b>$</b>
<b>^I</b>in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z<b>$</b>

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

...