如何使用镜头库通过索引从列表中删除项目?

时间:2014-10-08 08:15:33

标签: haskell lens lenses

我可以使用这样的镜头查看列表中的第4项:

preview (ix 3) myList

是否有可以取代"预览"为了从列表中删除第四项而不是查看它?返回列表应与原始列表相同,表示第4项将被删除。

或者可能有一种方法可以使用过滤函数来做到这一点?

2 个答案:

答案 0 :(得分:3)

听起来您想使用ifiltered

toListOf (folded . ifiltered (\i _ -> i /= 3)) $ myList

-- or

myList ^.. folded . ifiltered (\i _ -> i /= 3))

答案 1 :(得分:2)

使用MonoidFoldable可以采用更通用的方法。

deleteN
  :: (Foldable f, Monoid (f a))
  => (a -> f a -> f a) -- ^ cons operator
  -> Int -- ^ index to delete
  -> f a -- ^ initial structure
  -> f a -- ^ resultant structure
deleteN cons n xs = flipTfo xs $ folded . ifiltered (\i _ -> i /= n)
  where
    flipTfo = flip toFoldableOf
    toFoldableOf l = foldrOf l cons mempty

你可以专门用它来列出

deleteList :: Monoid a => Int -> [a] -> [a]
deleteList = deleteN (:)