为什么使用fromMaybe提取IO(Maybe Bool)会执行两个IO操作

Dre*_*rew 2 io haskell lazy-evaluation

在这段代码中:

 fromMaybe <$> (print "A" >> return True) <*> (print "B" >> (return $ Just False))
 fromMaybe <$> (print "A" >> return True) <*> (print "B" >> (return $ Nothing))
Run Code Online (Sandbox Code Playgroud)

我预计,由于懒惰,"A"或"B"将被打印,这取决于我是否提供Just something或者Nothing两者都打印,无论如何.有人可以解释一下这里到底发生了什么?和b)我怎样才能达到我想要的效果?

J. *_*son 6

专注于(print "B" >> (return $ Just False))print用a return中的命令对命令进行排序IO Monad.因为它是a Monad,所以它需要print "B"在能够评估return语句之前准确地评估以获得"值"(即使它被忽略).用于printIO单子该装置执行的副作用.

这种排序发生在两个IO参数中,因此在它们能够传递给纯计算之前fromMaybe,所有的效果都已经被执行了.Applicative老是执行所有的效果第一,然后计算的纯值的纯计算.

fromMaybe True <$> case thing of
  Just _  -> print "A" >> return thing
  Nothing -> print "B" >> return thing
Run Code Online (Sandbox Code Playgroud)

或者,fromMaybe True <$> when (isJust thing) (print "A") >> print "B" >> return thing如果这是更好的行为.