Entendendo A Função Reduce
A parte 2 se encontra aqui. Entendendo a função reduce - Parte 2
Introdução
Faz um tempo que eu não escrevo nenhum blogpost. Nesse período eu andei estudando haskell e achei uma função que bem interessante chamada fold, mas essa função é mais conhecida como reduce. O que faz essa função ser bem interessante é o fato de que ela contém bastante informação em pouquíssimas linhas de código.
Implementando um simples problema
Só pra mostrar um pouco do que o reduce é capaz de fazer, vamos imaginar um problema hipotético: Você recebe uma lista de compras que um cliente fez, e precisa somar todos os valores dessa lista.
Muitas linguagens fornecem funções pra somar os valores de uma lista, mas vamos implementar a nossa própria função só por questões didáticas.
Primeiro eu vou implementar essa função no bom e velho PHP escrevendo sem usar reduce, só com um foreach mesmo.
Depois vou implementar usando Javascript e reduce, e por fim vou mostrar como seria essa função em haskell
Versão no PHP
|
|
Versão JS com reduce
|
|
Versão em haskell
|
|
Como você pode ver, o reduce torna seu código muito menos verboso, e na minha opinião, esse jeito minimalista e declarativo é bem elegante, mas creio que seja justamente por isso que a função fold (mais conhecida como reduce) seja tão incompreendida.
Tendo isso em vista, vamos então entender com calma o que a função reduce está fazendo por baixo dos panos. Pra entender como o reduce funciona, nós vamos implementar a nossa própria versão dele, da forma mais explicita possível.
Implementando nosso próprio reduce
Vou usar javascript, mas funcionaria com praticamente qualquer linguagem. Aqui está a definição original do array.reduce
|
|
Mas como os parâmetros currentIndex
e arr
são opcionais, vou fazer uma definição mais simples para explicar de forma mais didática.
Obs: O parâmetro initialValue também é opcional, mas eu considero ele importante demais para omitirmos na nossa implementação
|
|
Agora vamos implementar logo a nossa versão simplificada do reduce
|
|
E se eu chamar a minha nova função, tudo deve funcionar
|
|
Sim, eu diria que uma das principais funções do reduce é pegar uma lista de itens e retornar um único item. Como nas duas primeiras funções onde nós pegávamos umas lista de inteiros e REDUZÍAMOS a lista a somente um inteiro.
Mas também é possível que nosso reduce receba uma lista e retorne outra lista. Basta que o valor inicial seja um array vazio, para que o acumulador consiga usar a função push para colocar itens dentro de si.
Recapitulando
Bom, esse artigo já está ficando grande demais, então vamos somente recapitular o que aprendemos antes de finalizar:
- O reduce (mais conhecido como fold em algumas linguagens) é uma função que pode fazer muitas coisas com poucas linhas de código
- A função reduce é bastante usada para pegar uma lista de valores e reduzir essa lista a somente um item.
- O reduce recebe uma função anônima que será aplicada ao acumulador e a cada item da sua lista, recebe um valor inicial para o acumulador, e recebe a própria lista
- A função anônima deve receber como parâmetro, no mínimo o seu acumulador e o item atual da sua lista (lembre-se que a função vai ser chamada dentro de um loop que vai varrer toda a sua lista). Além desses dois itens obrigatórios algumas linguagens te permitem colocar mais parâmetros na sua função anônima, mas esses são opcionais.
E é isso pessoal. Foi bom escrever um pouco sobre essa função que é bem confusa de se entender quando vemos ela pela