Haskell错误:输入`='时解析错误

时间:2010-08-09 01:05:43

标签: syntax haskell indentation ghc ghci

功能

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 = 2z = 3中的标签。没有骰子。

(不受欢迎的)解决方案

我获得编译代码的唯一方法是

  1. 用空格替换硬标签。
  2. let子句替换where子句。

5 个答案:

答案 0 :(得分:16)

#haskell上的Saizan解释说,let表达式中的赋值必须对齐,而不是本身。只要分配排队,就可以使用硬标签或软标签。

正确的代码:

module Main where

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

答案 1 :(得分:11)

您无法使用标签正确控制缩进,因为标签的大小未定义。

因此,请勿在Haskell中使用制表符。他们是邪恶的。

答案 2 :(得分:3)

将let-block中的每个声明缩进到相同的程度。同样好的形式是将'in'和'let'缩进到同一级别。例如..

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

答案 3 :(得分:2)

就个人而言,我在每行的末尾加上分号

module Main where

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

答案 4 :(得分:1)

如果您在源代码中坚持使用TAB字符,则会进行以下编译:

module Main where

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

其中所有前导空格都是一个或两个TAB,letx = 1之间的空格也是TAB。在vi的list mode中查看以显示TAB和行尾:

module Main where$
$
main =$
^Ilet^Ix = 1$
^I^Iy = 2$
^I^Iz = 3$
^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$

如果你切换到空格,你的生活将变得更加简单,你的代码会更漂亮。