Control.Lens.Fold包含filtered,我可以在应用单子动作之前使用它过滤列表。似乎没有相应的filteredM-但是有办法获得这种效果吗?

明确地说,我有

xs      :: [ MyType ]
predM   :: MyType -> MyMonad Bool
actionM :: MyType -> MyMonad ()


如何将actionM应用于xs返回predMTrue的每个元素?

一个重要的约束是我想在predM的第一次调用之前对actionM的所有调用进行排序-因此,我需要一种在列表上进行两次传递的方法。我不能只将predMactionM组合成一个函数。

最佳答案

为什么不

mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE


要不就

mapM_ actionM <=< filterM predM $ xs


如果您真的只需要处理清单

10-05 21:37