こんなレンズが欲しい
Lens' (Maybe (a, b)) (Maybe a)
Lens
しかし、元に戻すと にもNothing
影響するため、それは完全にはできませんb
。それはすることができますGetter
getA :: Getter (Maybe (a, b)) (Maybe a)
getA = to (fmap fst)
しかし、それを作成するとGetter
、完全ではなく、同様に終了しますLens
maybeFst :: Ord k => k -> Getter (Map k (a, b)) (Maybe a)
maybeFst k = at k . getA
おそらくそれよりも良いのは、Traversal
代わりにa を使用することです
maybeFstT :: Ord k => k -> Traversal' (Map k (a, b)) a
maybeFstT k = at k . _Just . _1
これにより、マップ内の値の値を取得 (preview
またはを使用toListOf
) および設定するfst
ことができますが、マップ内のその存在を変更することはできません: 値が存在しない場合は追加できません。削除することはできません。
最後に、適切なタイプのフェイクLens
を仮装することができますが、デフォルト値を与える必要があります。b
getA :: b -> Lens' (Maybe (a, b)) (Maybe a)
getA b inj Nothing = (\x -> (,b) <$> x) <$> inj Nothing
getA _ inj (Just (a, b)) = (\x -> (,b) <$> x) <$> inj (Just a)
しかし、あまり似ていない動作があることに注意してLens
ください。
>>> Just (1, 2) & getA 0 .~ Nothing & preview (_Just . _2)
Nothing
>>> Nothing & getA 0 .~ Just 1
Just (1,0)
多くの場合、事故を防ぐためにこれらの疑似レンズを使用しない方がよいでしょう。