Можно ли расширить бесплатные переводчики монад?
Предоставляется бесплатная монада 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, который «компилируется» в двоичный формат. Бинарный формат содержит некоторую дополнительную информацию после каждой пользовательской команды. Это должно быть там, но совершенно не имеет значения в моем случае использования.