haskell主块中的空白解析错误

时间:2014-05-16 04:29:44

标签: haskell whitespace main

Haskell似乎对我的主要功能中的空白非常挑剔。

以下编译很好

module Main where
import System.Environment

main :: IO()
main = do args <- getArgs
          putStrLn ("Hello, " ++ args !! 0)

但是以下两个程序给我一个解析错误

module Main where
import System.Environment

main :: IO()
main = do args <- getArgs
           putStrLn ("Hello, " ++ args !! 0)

module Main where
import System.Environment

main :: IO()
main = do args <- getArgs
         putStrLn ("Hello, " ++ args !! 0)

似乎printStrLn 必须args排成一行,否则haskell会合适。这似乎没必要。为什么haskell会这样做?

2 个答案:

答案 0 :(得分:2)

要添加到Mephy’s answer,而Haskell,用通常的Haskell样式编写, 关心缩进(在规范中称为'layout'),您可以用样式编写代码这样就会忽略缩进:

module Main where {
    import System.Environment;

    main :: IO ();
    main = do {
        args <- getArgs;
        putStrLn ("Hello, " ++ args !! 0)
    }
}

您通常不会将此样式用于整个模块。偶尔你会看到它被用于一个简短的dolet块或其他东西(你可以混合两种样式),但大多数人都依赖布局。

答案 1 :(得分:1)

Haskell确实关心缩进,就像Python一样。使用do构造时,必须将所有操作放在同一列中。请注意,您还需要使用空格,而不是标签,因为&#39; \ t&#39;通常会被忽略。