2017-07-26 19 views
6

Hãy tưởng tượng tôi có danh sách sau đây:Áp dụng hai nếp hoặc Getters và chỉ thành công khi cả hai thành công

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

Sử dụng thư viện ống kính, tôi muốn trích xuất các phần tử của các bộ, nhưng tôi chỉ muốn nó thành công khi phần tử thứ hai là Just. Tôi muốn có một số quang, split mà làm việc như thế này:

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

tôi có thể thực hiện split bản thân mình như thế này:

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

... mà dường như để làm việc. Tuy nhiên, điều này có vẻ như tôi phải tái phát minh ra bánh xe. Có một cái gì đó đã được cung cấp bởi thư viện ống kính mà thực hiện điều này một cách tốt đẹp không?

Trả lời

6

Các aside combinator mất một Prism rằng hoạt động trên các thành phần thứ hai của một tuple và trả về một Prism rằng hoạt động trên toàn bộ tuple:

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

Kết quả là trận đấu lăng kính khi các thành phần được phù hợp, nếu không nó không thành công .

Kết hợp nó với tobimap, chúng tôi có thể tái tạo ví dụ của bạn:

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

Để làm việc trên các thành phần đầu tiên, chúng ta có thể sử dụng swapped:

ghci> [(Just 3,False)]^..folded.swapped.aside _Just.swapped 
[(3,False)] 
Các vấn đề liên quan