在我的程序中,我使用if'
在其中一个模块中定义的函数而不是内置if-then-else
构造。它的定义很简单,而且工作得很好。
但是,在代码中有一个地方我需要将它应用到 monad 值(IO
在我的例子中),即类型签名应该看起来有点像IO Bool -> IO a -> IO a -> IO a
. 自然地,我试图抬起它。
if' <$> mb <*> action1 <*> action2
但是当我尝试评估表达式时,我没有得到我期望的结果。
*Main> if' <$> return True <*> putStrLn "yes" <*> putStrLn "no"
yes
no
我知道<*>
描述是“顺序应用”,所以也许就是这样。但是这里发生了什么?我可以在不编写全新的专用函数的情况下修复它吗?