2017-07-26 37 views
6

başarılı biterken sadece aşağıdaki liste var düşünün başarılı: mercek kütüphanesini kullanmaiki kıvrımlar veya getters uygulayın ve hem

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

, ben dizilerini unsurları ayıklamak istiyorum ama sadece başarılı olmak istiyorum ikinci eleman Just olduğunda.

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

Kendimi böyle split uygulayabilirsiniz:

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

... iş gibi görünüyor bu gibi çalışır bazı optik, split istiyorum. Ancak, bu, tekerleği yeniden icat etmem gerekiyormuş gibi görünüyor. Objektif kütüphanesi tarafından bunu zaten güzel bir şekilde gerçekleştiren bir şey var mı?

cevap

6

aside combinator tuple ikinci bileşenin üzerinde çalışan bir Prism alır ve bütün başlığın üzerinde çalışan bir Prism döndürür: Bileşen eşleştiğinde

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

çıkan prizma maçları

, aksi takdirde başarısız .

to ve bimap ile birleştirerek, biz örnek üretebilir:

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

ilk bileşenin üzerinde çalışmak için, kullanabileceğimiz swapped:

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