为什么我会写这样的东西:
main :: IO ()
main = getLine >>= putStrLn
从getLine :: IO String
和putStrLn :: String -> IO String
开始,此操作的整体类型似乎应为IO String
。为什么编译而不是给出类型错误?我能想出的唯一原因是在编译时>> return ()
被添加到main
的值的末尾。那么这里发生了什么?
答案 0 :(得分:10)
实际上,putStrLn :: String -> IO ()
。所以没有任何神奇的事情发生。
您也可以通过编写
来验证这一点main :: IO String
main = getLine
并观察到这两个(1)确实编译而且(2)如果在>> return ()
中插入了隐式main
,则无法编译。