在Haskell的每个主要文件末尾都有一个隐藏的“>> return()”吗?

时间:2017-09-25 19:37:26

标签: haskell types monads

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

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

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

1 个答案:

答案 0 :(得分:10)

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

您也可以通过编写

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

并观察到这两个(1)确实编译而且(2)如果在>> return ()中插入了隐式main,则无法编译。

相关问题