在计算IO (IO ())时,会同时计算(IO ())和(),那么为什么
main :: IO (IO ())
main = print <$> (print "Hello, World!")打印
"Hello, World!"不
IO "Hello, World!" -- ??
"Hello, World!"发布于 2019-10-21 19:22:01
main :: IO (IO ())
main = print <$> (print "Hello, World!")多亏了单元律,它等同于
main :: IO (IO ())
main = do
result <- print "Hello, World!"
return (print result)现在,print总是返回()作为结果,所以整个代码等同于
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())最后,main的结果被简单地丢弃。也就是说,最后一行可以是return (putStrLn "this is ignored"),并具有相同的效果。
因此,代码将只执行第一个print "Hello, World!"。
我建议您始终定义main :: IO ()。Haskell允许我们声明main :: IO AnyTypeHere,但这(IMO)令人困惑。
我还建议您使用putStrLn而不是print来打印字符串,因为后者将对整个字符串进行引号和转义。
https://stackoverflow.com/questions/58485062
复制相似问题