Thanks for the insightful response. I ran your Rust playground sample code.
I believe I misunderstood how map/skip interacts.
If we do:
let x = blahblah.map(f).skip(n).sum();
Interpretation A = map is lazy, we don't need the first n results. Therefore, f is NEVER called on the first n elements.
Interpretation B = Because of the .sum(), we need the the full result of blahblah.map(f).skip(n). To get this, we are going to force f to execute on all of blahblah, then skip the first n.
The rust playground code you posted clearly shows that (B) is the correct interpretation. I posted the question incorrectly assuming that (A) was how things worked.
I don't think this is set in stone however. The default version of skip uses nth to skip items. Map doesn't override skip nor nth so the iterator have to go through every item.
I don't know if there is a reason to not override them or if it's just not implemented yet.
The difference in behavior of map would be easily observable.
Specifically the docs say
Takes a closure and creates an iterator which calls that closure on each element.
So that optimization would be inconsistent with this statement. So I don't think it would be a good idea, especially given you can manually get it by switching the order of map and skip.