2017-07-26 47 views
6

Wyobraźmy mam następującą listę:Nałożyć dwie fałdy albo pobierające i tylko udaje, gdy oba uda

lst :: [(Bool, Maybe Integer)] 
lst = [(True, Just 3), (True, Nothing), (False, Just 12)] 

Korzystanie z biblioteki obiektywu, chcę, aby wyodrębnić elementy krotki, ale chcę tylko, że aby odnieść sukces gdy drugim elementem jest Just. Chcę trochę Optic, split że działa tak:

> lst ^.. folded.split (_1.to not) (_2._Just) 
[(False, 3), (True, 12)] 

mogę wdrożyć split sobie tak:

split :: Getting (First a) s a -> Getting (First b) s b -> Fold s (a, b) 
split a b = folding (\x -> (,) <$> (x ^? a) <*> (x ^? b)) 

... co wydaje się działać. Jednak wygląda na to, że muszę wymyślić nowe koło. Czy jest coś, co zostało dostarczone przez bibliotekę soczewek, która dokonuje tego w równie przyjemny sposób?

Odpowiedz

6

aside syntezatora zajmuje Prism który pracuje nad drugim składnikiem krotki i zwraca Prism który działa w całym krotki:

ghci> lst ^.. folded.aside _Just 
[(True,3),(False,12)] 

wynikowej pryzmatów, gdy składnik jest dopasowany, w przeciwnym razie nie uda .

łącząc ją z to i bimap możemy odtworzyć swój przykład:

ghci> lst ^.. folded.aside _Just.to (bimap not id) 
[(False,3),(True,12)] 

Aby pracować nad pierwszym składniku, możemy użyć swapped:

ghci> [(Just 3,False)]^..folded.swapped.aside _Just.swapped 
[(3,False)]