While writing code to rewrite some Dhall syntax trees, I noticed a cool
connection between the core uniplate
operation and optics. This will be old news to advanced
lens users, but I think it’s worth pointing out. The
uniplate package’s original
uniplate :: Uniplate a => a -> ([a], [a] -> a) is
an early attempt at a “traversal” optic, properly expressed in
lens by plate :: Plated a => Traversal' a a.