首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`print <$> (print "hello")`打印"hello"?

为什么`print <$> (print "hello")`打印"hello"?
EN

Stack Overflow用户
提问于 2019-10-21 19:10:32
回答 1查看 637关注 0票数 14

在计算IO (IO ())时,会同时计算(IO ())(),那么为什么

代码语言:javascript
复制
main :: IO (IO ())
main = print <$> (print "Hello, World!")

打印

代码语言:javascript
复制
"Hello, World!"

代码语言:javascript
复制
IO "Hello, World!" -- ??
"Hello, World!"
EN

回答 1

Stack Overflow用户

发布于 2019-10-21 19:22:01

代码语言:javascript
复制
main :: IO (IO ())
main = print <$> (print "Hello, World!")

多亏了单元律,它等同于

代码语言:javascript
复制
main :: IO (IO ())
main = do 
   result <- print "Hello, World!"
   return (print result)

现在,print总是返回()作为结果,所以整个代码等同于

代码语言:javascript
复制
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来打印字符串,因为后者将对整个字符串进行引号和转义。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58485062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档