我可以使用monadic动作从Control.Lens过滤折叠吗?

时间:2013-07-13 03:41:28

标签: haskell lenses lens

Control.Lens.Fold包含filtered,我可以在应用某些monadic操作之前过滤列表。似乎没有相应的filteredM - 但有没有办法达到这个效果?

要清楚,说我有

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

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

一个重要的限制是我想在第一次调用predM之前对actionM的所有调用进行排序 - 所以我需要一种方法在列表上进行两次传递。我不能将predMactionM合并为一个函数。

1 个答案:

答案 0 :(得分:5)

为什么不

mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE

或只是

mapM_ actionM <=< filterM predM $ xs

如果你真的只需要在列表上工作