我试图将以下内容整理成一个漂亮的单行代码:
(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
重复性较低,但看起来并不直观。我想知道,似乎无法找到的是,是否有一个标准的组合子可以加入这些行动并将其结果组合起来?
答案 0 :(得分:4)
实际上,liftM2
很直观,但需要一些时间来习惯。答案是肯定的,liftM2
或liftA2
是您案例的标准组合。如果您真的想要一个可读的解决方案,还有许多其他选择:
<*>
运营商:(,) <$> action1 <*> action2
MonadComprehensions
分机:[(r1, r2) | r1 <- action1, r2 <- action2]