Scala Reduce vs Fold

There is only a subtle difference between reduce and fold. Fold requires an initial value, whereas reduce doesn’t need one.

Reduce example:

scala> (1 to 10).reduce(_ * _)
val res0: Int = 3628800

Fold example:

scala> (1 to 10).fold(0)(_ * _)
val res0: Int = 0

scala> (1 to 10).fold(1)(_ * _)
val res1: Int = 3628800

This is because reduce requires the operator to be both commutative and associative, whereas fold requires the operator to be associative only.

A reminder of some basic arithmetics concepts:

Commutative property: \[ a + b = b + c \]

Associative property: \[ (a + b) + c= a + (b + c) \]