Как написать монаду, которая печатает «шаг i из N» при выполнении каждого оператора в монаде?
Я даже не уверен, что это возможно в любой монаде; это нарушает законы монады? Но кажется, что-то, что должно быть возможно в той или иной конструкции. Конкретно есть ли способ иметь что-то, что я могу написать что-то вроде
do
someOp ()
someOtherOp ()
thirdOp ()
и это напечатало бы
step 1 of 3
step 2 of 3
step 3 of 3
Для этого потребуется Template Haskell или будет работать монада? (А если требуется Template Haskell, как это сделать?)