Спецификации
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
еще больше. Провал.
(Нежелательные) Решения
Единственным путем я добрался, код для компиляции также
let
пункт с a where
пункт.Сайзан на #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
Если вы настаиваете на использовании символов TAB в исходном тексте, компилируется следующее:
module Main where
main =
let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
, где все ведущие пробелы - это либо одна, либо две табуляции, а пробелы между let
и x = 1
также является TAB.Просмотрено в режиме списка vi , чтобы сделать табуляторы и концы строк явными:
module Main where$ $ main =$ ^Ilet^Ix = 1$ ^I^Iy = 2$ ^I^Iz = 3$ ^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$
Ваша жизнь станет намного проще, а код красивее, если вы переключитесь на пробелы.
Отступ каждого объявления в let-блоке должен быть одинаковым. Также хорошей формой является отступ "in" и "let" на один и тот же уровень. Например.
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Вы просто не можете правильно управлять отступом с помощью вкладок, потому что размер вкладки не определен.
Поэтому не используйте табуляции в Haskell. Они - зло.