Haskell中的main函数总是以main = do开头吗?

Aug*_*son 5 haskell program-entry-point do-notation

在java中我们总是写:

public static void main(String[] args){...}
Run Code Online (Sandbox Code Playgroud)

当我们想要开始编写程序时.

我的问题是,对于Haskell,IE是否相同:我是否总是可以确定声明:main = do,当我想在Haskell中为程序编写代码时?

例如:

main = do  
    putStrLn "What's your name?"  
    name <- getLine 
    putStrLn ("Hello " ++ name) 
Run Code Online (Sandbox Code Playgroud)

该程序将询问用户"你叫什么名字?" 然后,用户输入将存储在name-variable中,并且在程序终止之前将显示"Hello"++名称.

Wil*_*sem 11

简短的回答:,我们必须宣布一个main =,但不是一个do.

main必须是一个IO单子类型(所以IO a),其中a是任意的(因为它被忽略),因为是写在这里:

名称的使用main很重要:main被定义为Haskell程序的入口点(类似于mainC中的函数),并且通常必须具有IO类型IO ().

但你没有必要需要do注释.其实do语法糖.main事实上你是:

main =
    putStrLn "What's your name?" >> getLine >>= \n -> putStrLn ("Hello " ++ n)
Run Code Online (Sandbox Code Playgroud)

或者更优雅:

main = putStrLn "What's your name?" >> getLine >>= putStrLn . ("Hello " ++)
Run Code Online (Sandbox Code Playgroud)

所以这里我们写了一个main没有do注释.有关desugaring do符号的更多信息,请参阅此处.