Можно ли расширить бесплатные переводчики монад?

Предоставляется бесплатная монада DSL, такая как:

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

type Foo = Free FooF

И случайный переводчик дляFoo:

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

Мне кажется, что должна быть возможность что-то включать в каждую итерацию printFoo, не прибегая к тому, чтобы делать это вручную:

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

Возможно ли это как-то «обернуть» оригинал?printFoo?

Мотивация: я пишу небольшой DSL, который «компилируется» в двоичный формат. Бинарный формат содержит некоторую дополнительную информацию после каждой пользовательской команды. Это должно быть там, но совершенно не имеет значения в моем случае использования.

Ответы на вопрос(5)

Ваш ответ на вопрос