Sat Jul 7 16:55:11 EDT 2018
Took me a while to figure out how to approach this, but it's really
simple when you focus on the types.
Functor compositions tend to pop up in ad-hoc places. It is important
to realize that it is not necessary to use the Data.Functor.Compose
It is often simpler and clearer to only define a specialized mapping
mapBindings :: (a -> b) -> [(a, Term (Op a))] -> [(b, Term (Op b))]
mapBindings f l = map f' l where
f' (name, term) = (f name, (fmap . fmap) f term)
I still find the implementation hard to read, but the type is really
clear, so the approach is to write that first, then compose fmap and
any specialized mapping functions as needed.