Czy możliwe jest rozszerzenie bezpłatnych tłumaczy monadowych?

Biorąc pod uwagę darmowy DSL monad, taki jak:

data FooF x = Foo String x
            | Bar Int    x
  deriving (Functor)

type Foo = Free FooF

I losowy tłumacz dlaFoo:

printFoo :: Foo -> IO ()
printFoo (Free (Foo s n)) = print s >> printFoo n
printFoo (Free (Bar i n)) = print i >> printFoo n

Wydaje mi się, że powinno być możliwe przeplatanie czegoś w każdej iteracji printFoo bez uciekania się do robienia tego ręcznie:

printFoo' :: Foo -> IO ()
printFoo' (Free (Foo s n)) = print s >> print "extra info" >> printFoo' n
printFoo' (Free (Bar i n)) = print i >> print "extra info" >> printFoo' n

Czy jest to możliwe dzięki „zawinięciu” oryginałuprintFoo?

Motywacja: Piszę mały DSL, który „kompiluje” do formatu binarnego. Format binarny zawiera dodatkowe informacje po każdym poleceniu użytkownika. Musi tam być, ale w mojej walizce nie ma znaczenia.

questionAnswers(5)

yourAnswerToTheQuestion