Answers:
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")
具有相同的效果。
因此,代码将只执行first print "Hello, World!"
。
我建议您始终定义main :: IO ()
。Haskell允许我们声明main :: IO AnyTypeHere
,但这(IMO)令人困惑。
我还建议您使用putStrLn
,而不要print
打印字符串,因为后者将引用并转义整个字符串。
f <$> a ≡ a >>= \r -> return $ f r
是,这不仅是这种情况的具体内容,而且实际上适用于任何monad。
fmap print (print "Hello World")
将其第一个参数(print
函数)应用于的结果print "Hello World"
。这完全等同于执行操作print ()
后调用print "Hello World"
。