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
.