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

ajp*_*ajp 3 haskell lenses haskell-lens

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

要清楚,说我有

xs      :: [ MyType ]
predM   :: MyType -> MyMonad Bool
actionM :: MyType -> MyMonad ()
Run Code Online (Sandbox Code Playgroud)

我怎么能申请actionM到的每个元素xs这对于predM返回True

一个重要的约束是我想predM在第一次调用之前对所有调用进行排序actionM- 所以我需要一种方法在列表上进行两次传递.我不能只是结合predMactionM成一个单一的功能.

Phi*_* JF 5

为什么不

mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE
Run Code Online (Sandbox Code Playgroud)

要不就

mapM_ actionM <=< filterM predM $ xs
Run Code Online (Sandbox Code Playgroud)

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

  • `toListOf :: Traversal'sa - > s - > [a]`会给你列表. (3认同)