【问题标题】:Is there a hidden ">> return ()" at the end of every main in Haskell?Haskell 中每个 main 的末尾是否有隐藏的“>> return ()”?
【发布时间】:2018-03-06 21:04:39
【问题描述】:

我怎么会这样写:

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

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

【问题讨论】:

  • 没有。 putStrLn 的类型为 String -> IO (),因此您的假设不正确。
  • putStrln 具有以下类型:putStrLn :: String -> IO ()。这在直觉上也是正确的,因为我们不期望返回一个String,我们只是想要打印到控制台的IO效果。

标签: haskell types monads


【解决方案1】:

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

您也可以通过编写来验证这一点

main :: IO String
main = getLine

并观察到,如果将隐式 >> return () 插入到 main 中,则 (1) 确实编译和 (2) 都无法编译。

【讨论】:

  • 第三个,如果main :: IO ()是不会编译的
  • @ThomasM.DuBuisson 啊,好点子!可以想象编译器会添加>> return (),但前提是main :: IO (),并且您建议的测试是排除这种情况的好方法。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 2021-02-08
  • 2014-07-18
  • 1970-01-01
  • 2019-08-22
  • 2011-03-06
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多