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.