そして万能型のfoldを呼び出す形で
このような特定の型の構造に依存しない抽象的なコードが
trait Iteratorに用意されているため使えます

fn reduce<F>(mut self, f: F) -> Option<Self::Item>
where
 Self: Sized,
 F: FnMut(Self::Item, Self::Item) -> Self::Item,
{
 let first = self.next()?;
 Some(self.fold(first, f))
}