Как удалить элемент из списка по индексу с помощью библиотеки объективов?

Я могу просмотреть, скажем, 4-й элемент в списке, используя такую ​​линзу:

preview (ix 3) myList

Есть ли что-то, что могло бы заменить «предварительный просмотр», чтобы удалить четвертый элемент из списка вместо его просмотра? Список возврата должен быть таким же, как исходный список, скажем, 4-й элемент будет удален.

Или, возможно, есть способ сделать это с помощью фильтруемой функции?


person Richard Parsons    schedule 08.10.2014    source источник


Ответы (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 (:)
person chessai    schedule 05.04.2018