I think, fold is needed. for_each is too imperative for my taste and fold allows running functions without any state in them.
let result = iter.fold(initial, my_pure_function);
// vs
let mut result = initial;
iter.for_each(|x|result = my_pure_function(result, x));
let result = result; // to remove mutability
I think, it is more about missed optimization in rustc or LLVM or std.