doDishes [] = done
doDishes (dish:dishes) = clean dish >> doDishes dishes
Very much a recursion in my opinion.Recursion can cause stack overflow in lazy language too. But lazy or strict, that's more of an implementation detail although a very visible one. An iteration that appends to a list will run out of memory just the same. I also don't see how a recursion that runs out of stack space is any more dangerouse than an iteration that goes to an infinite loop.