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

时间:2015-07-07 17:22:29

标签: haskell

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

foo = do
  x <- checker bar
  when x dostuff

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

foo' = do
  checker bar >>= \case
    True -> dostuff
    _    -> return ()

但显然没有第二种情况。

2 个答案:

答案 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