
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