我可以使用这样的镜头查看列表中的第 4 项:
preview (ix 3) myList
有没有什么东西可以代替“预览”以便从列表中删除第四个项目而不是查看它?返回列表应与原始列表相同,即第 4 项将被删除。
或者也许有一种方法可以使用过滤功能来做到这一点?
我可以使用这样的镜头查看列表中的第 4 项:
preview (ix 3) myList
有没有什么东西可以代替“预览”以便从列表中删除第四个项目而不是查看它?返回列表应与原始列表相同,即第 4 项将被删除。
或者也许有一种方法可以使用过滤功能来做到这一点?
听起来你想使用ifiltered
:
toListOf (folded . ifiltered (\i _ -> i /= 3)) $ myList
-- or
myList ^.. folded . ifiltered (\i _ -> i /= 3))
有一种更通用的方法可以做到这一点,使用Monoid
and 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 (:)