
The thing that really clicked lenses for me was reading through some of Twan van Laarhoven's slides where he presented an isomorphic definition of lenses. Googling reveals he actually has a very nice blog entry about this now. http://twanvl.nl/blog/haskell/isomorphism-lenses To strip out the essential element. A lens is -- Isomorphisms/bijections between type @a@ and @b@ data Iso a b = Iso { fw :: a -> b, bw :: b -> a } -- Lenses with a data wrapper, in practice you might want to unpack the Iso type data Lens a b = forall r. Lens (Iso a (b,r)) That is, a lense is two functions 1 - fw : data -> (element, residue data) [ this takes apart the data ] 2 - bw : (element, residue data) -> data [ this puts it back together ] such that they are an isomorphism (i.e., if you take it apart and then put it back together you get the same thing). fw . bw = bw . fw = id This made sense to me pretty much as soon as I encountered it. This was certainly not the case with the other. Cheers! -Tyson PS: I would really encourage looking at the blog post. It is a relatively easy read and well worth it.