【发布时间】:2018-03-06 21:04:39
【问题描述】:
我怎么会这样写:
main :: IO ()
main = getLine >>= putStrLn
由于getLine :: IO String 和putStrLn :: String -> IO String,这个动作的整体类型似乎应该是IO String。为什么编译而不是给出类型错误?我能想到的唯一原因是在编译时>> return () 被添加到main 值的末尾。那么这里发生了什么?
【问题讨论】:
-
没有。
putStrLn的类型为String -> IO (),因此您的假设不正确。 -
putStrln 具有以下类型:
putStrLn :: String -> IO ()。这在直觉上也是正确的,因为我们不期望返回一个String,我们只是想要打印到控制台的IO效果。