Szukam filtru przejścia, a następnie wybierz ostatni element do użycia z over
.Przechodzenie przez ostatni element "przefiltrowanego"
np. coś w tym stylu (ale które faktycznie się skompiluje):
[1,2,3,4] & traverse . filtered even . _last +~ 10
> [1,2,3,14]
Jakieś pomysły?
P.S. Jestem świadomy, że filtered
jest poprawny tylko wtedy, gdy nie wpływa na liczbę elementów w przemianie.
Rzeczywistym przypadkiem użycia, który wykonuję, jest wybranie tylko najniższego poziomu rekursywnego przejścia uniplate
pasującego do pewnego predykatu; jeśli masz inne pomysły, jak to zrobić, chciałbym je usłyszeć!
Miałem pęknięcie w tym celu przechodząc w transformatorze stanu odwróconego monady, ale to daje podpis 'MonadFix m => Traversal 'sa -> LensLike' msa', który nie jest zbyt użyteczny - możesz tylko wstawiać do niego wartości, nie wyciągać ich, ponieważ 'Const s' nie jest' Monad'. Alternatywnym podejściem byłoby pobranie długości kolekcji przez złożenie, a następnie zliczenie stanowe aż do ostatniego indeksu - który dałby ograniczenie "Monad" zamiast "MonadFix" kosztem pewnej wydajności. Przechodzenie przez konkretną listę, jak w odpowiedzi @ Gurkenglasa, jest prawdopodobnie najlepszym rozwiązaniem –