It looks like your timedIterateIO is too lazy.
When you pass it a function like (+1) what will happen is that a large
chunk of the form ...+1+1+1+1+1 is build up on your heap. When you
finally need its value the large chunk will be evaluated causing it to
push the '1' arguments on the stack. When there are too much '1's your
stack will eventually overflow.
Try evaluating the 'y' before calling timedIterateIO' again as in:
let y = f x
... y `seq` timedIterateIO' t0 y
I think the normal 'iterate' function also has this behaviour:
iterate (+1) 0 !! 10000000
will cause your heap to be filled with lots of +1s and will finally
cause a stack overflow when it tries to evaluate the final value (I
haven't tried it so I may be wrong here).
regards,
Bas