/// Lens /// """ Laws: set l (get l a) a) = a get l (set l b a) = b set l c (set l b a) = set l c a """ data Lens a b = Lens (a -> b) (b -> a -> a) get :: Lens a b -> a -> b get (Lens f _) = f set :: Lens a b -> b -> a -> a set (Lens _ g) = g /*instance Category Lens where id = Lens id const f . g = Lens (get f . get g) (\x y -> set g (set f x (get g y)) y) */