2017-07-26 13 views
6

を成功した場合にのみ、私は次のリスト持っている想像してみて成功する:レンズのライブラリを使用して2つの折り畳みやゲッターを適用し、両方

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

、私はタプルの要素を抽出したいのが、私はそれが成功したいです2番目の要素がJustの場合

> 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)) 

...動作しているようです、私はこのように動作しますいくつかの光、splitをしたいです。しかし、私は車輪を再発明する必要があるようです。レンズライブラリーで既にこれを実現しているものはありますか?

答えて

6

asideコンビネータタプルの第二の構成要素上で動作し、全タプル上で動作Prismを返すPrismを取る:

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

成分が一致したときに得られたプリズムは、それ以外の場合は失敗し、一致。 tobimapとそれを組み合わせる

、私たちはあなたの例を再現することができます

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

最初のコンポーネント上で動作するために、我々はswappedを使用することができます。

ghci> [(Just 3,False)]^..folded.swapped.aside _Just.swapped 
[(3,False)] 
関連する問題