Haskell中每个main的末尾是否都隐藏着“>>return()”?

Is there a hidden ">> return ()" at the end of every main in Haskell?

我怎么会写成这样:

main :: IO ()
main = getLine >>= putStrLn

getLine :: IO StringputStrLn :: String -> IO String 开始,这个动作的整体类型似乎应该是 IO String。为什么这个编译而不是给出类型错误?我能想到的唯一原因是在编译时 >> return () 被添加到 main 的值的末尾。那么这是怎么回事?

实际上,putStrLn :: String -> IO ()。所以根本没有什么神奇的事情发生。

您也可以通过写

来验证这一点
main :: IO String
main = getLine

并观察到如果 main.

中插入了隐含的 >> return (),这两者 (1) 确实编译并且 (2) 不可能编译