# Reduce Examples

Let's start with a favorite of mine, the sum of a list of numbers:

``````[0, 1, 2, 3, 4].reduce(0, +)
// 10
``````

`+` is a valid `combinator` function as it will just add the `lhs` and the `rhs` and return the result, which is specifically the requirement `reduce` has.

Another example is building the product of a list of numbers:

``````[1, 2, 3, 4].reduce(1, *)
// 24
``````

Or what about reversing a list:

``````[1, 2, 3, 4, 5].reduce([Int](), { [\$1] + \$0 })
// 5, 4, 3, 2, 1
``````

Finally, something a tad more complicated. We'd like to partition a list based on a division criteria

``````typealias Acc = (l: [Int], r: [Int])
func partition(_ lst: [Int], criteria: (Int) -> Bool) -> Acc {
return lst.reduce((l: [Int](), r: [Int]()), { (ac: Acc, o: Int) -> Acc in
if criteria(o) {
return (l: ac.l + [o], r: ac.r)
} else {
return (r: ac.r + [o], l: ac.l)
}
})
}
partition([1, 2, 3, 4, 5, 6, 7, 8, 9], criteria: { \$0 % 2 == 0 })
//: ([2, 4, 6, 8], [1, 3, 5, 7, 9])
``````

The most interesting thing we're doing above is using a `tuple` as the accumulator. As you'll find out, once you start trying to incorporate `reduce` into your daily work-flow, `tuples` are a great way of quickly combining related data during a reduce operation.