2013-07-13 19 views
3

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

要清楚,说我有

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

如何申请actionMxs每个元素为其predM回报True

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

回答

5

为什么不

mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE 

或只是

mapM_ actionM <=< filterM predM $ xs 

如果你真的只需要一个列表

+0

好上工作,我实际上并不只是一个名单 - 我可以有过于简单化。我实际上有一个遍历,从control.lens.traversal – ajp

+3

'toListOf :: Traversal的a - > s - > [a]'会给你列表。 – shachaf

相关问题