我知道这个问题已经在这里被提出,但我不相信没有一个直截了当的答案。
我知道将副作用隐藏在(&&)中不是一件好事,但在我的情况下,副作用只是检查外部世界的某些东西(存在文件,检查修改时间等,询问用户是/否问题)。
那么有没有类似于Haskell的方法,如果cond1为false,就不执行cond2呢?
cond1, cond2 :: IO bool
main = do
cond <- liftM2 (&&) con1 con2
if cond
then result1
else result2
我原本期待的是类似于
cond <- all [con1, con2]
或等效的表达方式,但我找不到任何东西。
更新
我看到了很多手动解决方案。我仍然觉得这个函数应该在某处存在。
惰性求值的一个优点是它不仅可以像C语言中硬编码的&&
一样短路。令人惊讶的是,在Haskell中,当进入命令式模式时,甚至不能短路&&
。
虽然所有的解决方案都使用if来短路求值,但是否有一种方法可以创建一个通用的惰性liftM2
呢?
andM [] = return True
,然后andM (x:xs) = do b <- x; if b then andM xs else return False
。 - ErikRandM
是在monad-loops库中定义的,人们期望在这里找到像这样的东西http://hackage.haskell.org/package/monad-loops-0.4.2.1/docs/Control-Monad-Loops.html#v:andM。 - Michael