在Haskell的每个主要结尾都有一个隐藏的">> return()"吗?

Ebe*_*ley -4 monads haskell types

为什么我会写这样的东西:

main :: IO ()
main = getLine >>= putStrLn
Run Code Online (Sandbox Code Playgroud)

从那以后getLine :: IO String,putStrLn :: String -> IO String似乎这个行动的整体类型应该是IO String.为什么编译而不是给出类型错误?我能想出的唯一原因是在编译时>> return ()添加到值的末尾main.那么这里发生了什么?

Dan*_*ner 10

实际上,putStrLn :: String -> IO ().所以没有任何神奇的事情发生.

您也可以通过写作来验证这一点

main :: IO String
main = getLine
Run Code Online (Sandbox Code Playgroud)

并观察这两个(1)确实编译和(2)如果有一个隐式>> return ()插入,则无法编译main.