2013-07-13 20 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

相關問題