在haskell主块中出现空格解析错误



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为什么要这么做?

为了补充Mephy的答案,虽然Haskell以通常的Haskell风格编写,确实关心缩进(在规范中称为' layout '),但您可以以一种忽略缩进的风格编写代码:

module Main where {
    import System.Environment;
    main :: IO ();
    main = do {
        args <- getArgs;
        putStrLn ("Hello, " ++ args !! 0)
    }
}

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

Haskell确实关心缩进,就像Python一样。当使用do结构时,您必须将所有操作放在同一列中。注意,您还需要使用空格,而不是制表符,因为't'通常会被忽略。

相关内容

  • 没有找到相关文章

最新更新