首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在打印上应用functor

在打印上应用functor
EN

Stack Overflow用户
提问于 2021-06-09 01:31:21
回答 2查看 84关注 0票数 3

我一直在尝试分别打印两个值,并尝试了以下代码:

代码语言:javascript
复制
import System.Directory
main = getCurrentDirectory >>= \x -> (print <$> doesFileExist x) >> (print <$> doesDirectoryExist x)

但是它不打印任何东西,但是下面的代码运行得很好:

代码语言:javascript
复制
import System.Directory
main = getCurrentDirectory >>= \x -> doesFileExist x >>= print >> doesDirectoryExist x >>= print

第一个代码没有打印任何东西的原因吗?

EN

回答 2

Stack Overflow用户

发布于 2021-06-09 01:48:21

如果在IO操作上执行fmap print,则不会得到执行此打印的IO操作。您只是获得了一个IO操作,该操作执行原始操作具有的任何副作用,但它不会生成可打印的值作为结果,而是生成另一个IO操作作为结果,然后您可以在单独的步骤中执行该操作:

代码语言:javascript
复制
import Control.Applicative
import Data.Time

printCurrentTime :: IO ()
printCurrentTime = do
   tPrinter <- print <$> getCurrentTime
   tPrinter

或者,如果没有do表示法,

代码语言:javascript
复制
printCurrentTime = print <$> getCurrentTime >>= \tPrinter -> tPrinter

换句话说,

代码语言:javascript
复制
printCurrentTime = print <$> getCurrentTime >>= id

根据单子定律,f <$> a >>= ba >>= b . f是相同的,即

代码语言:javascript
复制
printCurrentTime = getCurrentTime >>= id . print

它与简单地

代码语言:javascript
复制
printCurrentTime = getCurrentTime >>= print

它可以使用do表示法编写为

代码语言:javascript
复制
printCurrentTime = do
   t <- getCurrentTime
   print t
票数 5
EN

Stack Overflow用户

发布于 2021-06-09 01:35:28

正如注释所述,您将获得一个IO (IO ())。我们可以使用join去掉重复的monad。

代码语言:javascript
复制
join (print <$> doesFileExist x)

但是"fmap然后join“实际上就是>>=的定义(join>>=可以相互定义)。这就是你的>>=能工作的原因。

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

https://stackoverflow.com/questions/67891911

复制
相关文章

相似问题

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