
I came up with this utility function so I can access some info (`n`) from the parent's level: hoistWithUpper :: forall f g s t n . (Functor g) => (forall a. f a -> n) -> n -> (forall a. n -> f a -> g a) -> (n -> s -> t) -> Free f s -> Free g t hoistWithUpper fu n0 hoistFr hoistPure = go n0 where go :: n -> Free f s -> Free g t go n fr = case fr of Pure s -> Pure (hoistPure n s) Free f -> let n2 = fu f in Free (go n2 <$> (hoistFr n f :: g (Free f s))) I wonder if there's already a generalized form of this in recursion-schemes? Admittedly I'm fine with my helper so don't loose nights on this, but a little type golfing never hurts. There's a similar function `inherit` [1] in fixplate, but that operates on Fix (Mu there), not Free. With Free I guess the complication is managing the different way of maintaining annotation at the Free and Pure ctors. Practically I pass in (\n f -> ConstProd (Pair (Const n) f)) -- for hoistFr (\n u -> (n,u)) -- for hoistPure. where newtype ConstProd c f a = ConstProd (Product (Const c) f a) Thanks! Robin [1]: http://hackage.haskell.org/package/fixplate-0.1.7/docs/src/Data-Generics-Fix...