I know that for this task there is at least one library in which there are some ready-made monad transformers, but I usually turn to a packet of pipes to roll on my own when I need it. I am using pipe-4.0.0, it will be in the hack this weekend, but you can grab it from github repo before that.
I also used the terminal-progress-bar package to make nice animation of the terminal.
{-
This animates:
> Working [=>.......................] 7% > Working [=====>...................] 20%
Each update erases the last bar, so it only takes up one line on the terminal. Then it ends like this:
> main Working [=========================] 100% [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]