Как написать монаду, которая печатает «шаг i из N» при выполнении каждого оператора в монаде?

Я даже не уверен, что это возможно в любой монаде; это нарушает законы монады? Но кажется, что-то, что должно быть возможно в той или иной конструкции. Конкретно есть ли способ иметь что-то, что я могу написать что-то вроде

do
  someOp ()
  someOtherOp ()
  thirdOp ()

и это напечатало бы

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

Для этого потребуется Template Haskell или будет работать монада? (А если требуется Template Haskell, как это сделать?)

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

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