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)
}
}
你通常不会看到这种风格被用于整个模块。偶尔你会看到它被用于一个简短的do
或let
块或其他东西(你可以混合这两种风格),但大多数人依赖布局。
Haskell确实关心缩进,就像Python一样。当使用do
结构时,您必须将所有操作放在同一列中。注意,您还需要使用空格,而不是制表符,因为't'通常会被忽略。