Functional Snippet #4: Flattening and Mapping Arrays
In functional programming, map
on arrays is a common operation. Surprisingly often, the result of map
is an array of arrays that needs to be flattened. In many functional languages, there is an operator defined for flattening, and then mapping. This operator is sometimes called bind. It maps a function f, and then flattens the resulting array of arrays into a single array:
infix operator >>= {}
func >>=<A, B>(xs: [A], f: (A )-> [B]) -> [B] {
return xs.map(f).reduce([], combine: +)
}
One cool use-case of this operator is combining multiple lists. For example, let's say we have a list of ranks, and a list of suits:
let ranks = ["A", "K", "Q", "J", "10",
"9", "8", "7", "6", "5",
"4", "3", "2"]
let suits = ["♠", "♥", "♦", "♣"]
Now, we can generate a list of all playing cards by enumerating all the ranks, and for each rank, combine them with each possible suit:
let allCards = ranks >>= { rank in
suits >>= { suit in [(rank, suit)] }
}
// Prints: [(A, ♠), (A, ♥), (A, ♦),
// (A, ♣), (K, ♠), ...