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)我怎样才能达到我想要的效果?
专注于(print "B" >> (return $ Just False))你print用a return中的命令对命令进行排序IO Monad.因为它是a Monad,所以它需要print "B"在能够评估return语句之前准确地评估以获得"值"(即使它被忽略).用于print在IO单子该装置执行的副作用.
这种排序发生在两个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如果这是更好的行为.