我可以使用这样的镜头查看列表中的第4项:
preview (ix 3) myList
是否有可以取代"预览"为了从列表中删除第四项而不是查看它?返回列表应与原始列表相同,表示第4项将被删除。
或者可能有一种方法可以使用过滤函数来做到这一点?
答案 0 :(得分:3)
听起来您想使用ifiltered
:
toListOf (folded . ifiltered (\i _ -> i /= 3)) $ myList
-- or
myList ^.. folded . ifiltered (\i _ -> i /= 3))
答案 1 :(得分:2)
使用Monoid
和Foldable
可以采用更通用的方法。
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 (:)