# Functional Snippet #5: Reduce

One of the most popular functions among functional programmers is `reduce`

(in other languages also sometimes known as `fold`

). The `reduce`

function operates on an array, takes an initial value, and combines each element with that value. For example, to sum an array of integers, we can define a function `sum`

that takes an initial value of `0`

and then combines the intermediate results using the `+`

operator.

```
let sum: [Int] -> Int = { $0.reduce(0, combine: +) }
```

To calculate the product, we can use the same approach with an initial value of `1`

and the multiplication operator.

```
let product: [Int] -> Int = { $0.reduce(1, combine: *) }
```

However, reduce does not just work on lists of integers. We could also write a function that checks if all `Bool`

s in a list are true.

```
let all: [Bool] -> Bool = { $0.reduce(true, combine: { $0 && $1 }) }
```

Reduce is very flexible, and you can use it on lists with any element type. It is even possible to define `map`

and `filter`

in terms of reduce, which is a good exercise if you’d like some practice.