4

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

preview (ix 3) myList

有没有什么东西可以代替“预览”以便从列表中删除第四个项目而不是查看它?返回列表应与原始列表相同,即第 4 项将被删除。

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

4

2 回答 2

3

听起来你想使用ifiltered

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

-- or

myList ^.. folded . ifiltered (\i _ -> i /= 3))
于 2014-10-08T08:38:52.857 回答
2

有一种更通用的方法可以做到这一点,使用Monoidand 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 (:)
于 2018-04-05T21:17:46.050 回答