收集两个monadic动作的结果

时间:2017-03-16 12:39:48

标签: haskell

我试图将以下内容整理成一个漂亮的单行代码:

(r1,r2) <- do
  r1 <- action1
  r2 <- action2
  return (r1,r2)

此代码段本身位于do - 块内。通过查看(,) :: a -> b -> (a, b)的类型,我想使用liftM2 (,) :: Monad m => m a -> m b -> m (a, b)。现在我可以把它写成

(r1,r2) <- liftM2 (,) action1 action2

重复性较低,但看起来并不直观。我想知道,似乎无法找到的是,是否有一个标准的组合子可以加入这些行动并将其结果组合起来?

1 个答案:

答案 0 :(得分:4)

实际上,liftM2很直观,但需要一些时间来习惯。答案是肯定的,liftM2liftA2是您案例的标准组合。如果您真的想要一个可读的解决方案,还有许多其他选择:

  • <*>运营商:(,) <$> action1 <*> action2
  • MonadComprehensions分机:[(r1, r2) | r1 <- action1, r2 <- action2]