使用when /除非不保存Monadic动作的结果

Joe*_*and 8 haskell

有没有办法在没有变量的情况下写这个x

foo = do
  x <- checker bar
  when x dostuff
Run Code Online (Sandbox Code Playgroud)

我在想象类似于LambdaCase的东西:

foo' = do
  checker bar >>= \case
    True -> dostuff
    _    -> return ()
Run Code Online (Sandbox Code Playgroud)

但显然没有第二种情况模式.

mhw*_*bat 15

Control.Monad.Extra,退房whenM.对于你的例子,那将是:

foo = whenM (checker bar) doStuff
Run Code Online (Sandbox Code Playgroud)

这是一个较长的示例,只是为了向您展示如何在whenM结构中使用多个语句.

foo = do
  doStuff1
  doStuff2
  whenM (checker bar) $ do
    doStuff3
    doStuff4
    doStuff5
  doStuff6
Run Code Online (Sandbox Code Playgroud)


ama*_*loy 10

最直截了当的答案是do手工去除,然后看看你是否可以编写一些相当但更漂亮的代码.你的dodesugars:

checker bar >>= \x -> when x dostuff
Run Code Online (Sandbox Code Playgroud)

所以,答案必须看起来像checker bar >>= f,f相当于

\x -> when x dostuff
Run Code Online (Sandbox Code Playgroud)

嗯,这很像部分应用when,对吧?除了你想提供第二个参数而不是第一个参数,所以你需要flip它:

checker bar >>= flip when dostuff
Run Code Online (Sandbox Code Playgroud)