I would go further and say with my experience of Haskell, lazyness is an anti-pattern for programming language design. The problem is performance is too unpredictable and magic. Programmers don’t understand that a recursion will build a stack of thunks for later evaluation, they just don’t have any intuition about the cost of operations. Yes it’s great for when you need streams, but for most uses its terrible, and Haskell programs get littered with strictness annotations to try and get them to perform well in time and space. It rapidly gets to the point that the program had strictness annotations everywhere, except where the author explicitly wants lazyness. So the lazyness by default seems a mistake for Haskell. How about eager by default with lazyness annotations? Well this is better, but it complicates the type system, and leads to needing two copies of data structures eager and lazy ones, not great either. How to deal with lazyness then? The best solution I have found is to use co-routines and ‘yield’, so that ‘some’ yields it’s results instead of returning them. However you don’t need specific language support for this you just need to define some as an iterator itself, so that it provides a new ‘successor’ definition. So iterators provide a mechanism for abstracting lazyness in an eager language as well, they are a pretty general abstraction.
As for making an algorithm more general that is the point. The definition of generic programming is to write the algorithm in the most general setting possible with no loss in efficiency. This means the most code re-use, and as the algorithms get used so much it becomes in everyone’s interest to read and understand them. Do you really find any of the algorithms in chapter 6 too complex? I personally find them much easier to read and understand than points-free functional notation, and some quick research I did suggests that most programmers, even functional enthusiasts find the imperative code easier to read and understand.
You should read elements of Programming from the beginning, but first watch this https://youtu.be/Ih9gpJga4Vc let’s talk some more after you have watched the video.
Edit: The video is about the book, so its not really about Iterators directly, but explains why the book was written, gives a good insight into Stepanov’s approach to programming, what the book is like to read, and how to approach reading the book.