2017-09-25 75 views
-4

为什么我能写这样的事:Haskell中每个主体的末尾是否存在隐藏的“>> return()”?

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

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

+6

编号'putStrLn'的类型是String - > IO()',所以你的假设是不正确的。 –

+2

putStrln具有以下类型:'putStrLn :: String - > IO()'。这也是直观正确的,因为我们不期望返回字符串,我们只需要打印到控制台的IO效果。 – madnight

回答

10

其实putStrLn :: String -> IO()。所以没有什么神奇的发生。

您也可以通过写

main :: IO String 
main = getLine 

,并指出这两者(1)不编译和(2)是否有插入main隐式>> return()不可能编译验证这一点。

+0

和三,它不会编译如果'main :: IO()' –

+0

@ ThomasM.DuBuisson啊,好点!人们可以想象编译器添加'>> return()',但只有当'main :: IO()'时,你提出的测试才是排除这个问题的好方法。 –