Представьте, что у меня есть следующий список:
lst :: [(Bool, Maybe Integer)]
lst = [(True, Just 3), (True, Nothing), (False, Just 12)]
Используя библиотеку линз, я хочу извлечь элементы кортежей, но я хочу, чтобы это удалось только тогда, когда вторым элементом является Just
. Мне нужна оптика split
, которая работает следующим образом:
> lst ^.. folded.split (_1.to not) (_2._Just)
[(False, 3), (True, 12)]
Я могу реализовать split
сам так:
split :: Getting (First a) s a -> Getting (First b) s b -> Fold s (a, b)
split a b = folding (\x -> (,) <$> (x ^? a) <*> (x ^? b))
… кажется, работает. Тем не менее, это похоже на то, что я должен изобретать велосипед. Есть ли что-то уже предоставленное библиотекой объективов, что делает это таким же хорошим способом?