2017-09-25 107 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()'時,你提出的測試纔是排除這個問題的好方法。 –

相關問題