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.