Como escrever uma mônada que imprime “passo i de N” ao executar cada afirmação na mônada?

Eu nem tenho certeza se isso é possível em qualquer tipo de mônada; isso viola leis de mônadas? Mas parece algo que deveria ser possível em algum tipo de construto ou outro. Especificamente existe alguma maneira de ter algo que eu possa escrever algo como

do
  someOp ()
  someOtherOp ()
  thirdOp ()

e imprimiria

step 1 of 3
step 2 of 3
step 3 of 3

Isso exigiria o Template Haskell ou uma mônada funcionaria? (E se for necessário o Template Haskell, como fazê-lo dessa maneira?)

questionAnswers(5)

yourAnswerToTheQuestion