Control.Lens.Fold包含filtered
,我可以在应用某些monadic操作之前过滤列表。似乎没有相应的filteredM
- 但有没有办法达到这个效果?
要清楚,说我有
xs :: [ MyType ]
predM :: MyType -> MyMonad Bool
actionM :: MyType -> MyMonad ()
如何将actionM
应用于xs
predM
返回True
的每个元素?
一个重要的限制是我想在第一次调用predM
之前对actionM
的所有调用进行排序 - 所以我需要一种方法在列表上进行两次传递。我不能将predM
和actionM
合并为一个函数。
答案 0 :(得分:5)
为什么不
mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE
或只是
mapM_ actionM <=< filterM predM $ xs
如果你真的只需要在列表上工作