有没有办法在没有变量x
的情况下写这个?
foo = do
x <- checker bar
when x dostuff
我正在想象类似于LambdaCase的东西:
foo' = do
checker bar >>= \case
True -> dostuff
_ -> return ()
但显然没有第二种情况。
答案 0 :(得分:15)
在Control.Monad.Extra
中,查看whenM
。对于你的例子,那将是:
foo = whenM (checker bar) doStuff
这是一个较长的示例,只是为了向您展示如何在whenM
结构中使用多个语句。
foo = do
doStuff1
doStuff2
whenM (checker bar) $ do
doStuff3
doStuff4
doStuff5
doStuff6
答案 1 :(得分:10)
最直接的答案是手工去除do
,然后看看你是否可以编写一些相当但更漂亮的代码。您的do
去世了:
checker bar >>= \x -> when x dostuff
所以,答案必须看起来像checker bar >>= f
,其中f
相当于
\x -> when x dostuff
嗯,这很像部分应用when
,对吧?除了你想要提供第二个参数而不是第一个参数,所以你需要flip
它:
checker bar >>= flip when dostuff