Executando verificação de segurança...
6

🦾 Um poder maneiro para o Javascript

Javascript e o Currying

Currying e aplicação parcial

Em algumas linguagens de programação, geralmente funcionais, existe um conceito que simplifica da maneira mais direta, você consegue criar uma função que recebe vários argumentos e passar argumentos de forma parcial.

Essa é a famosa aplicação parcial!

mas como assim?

Ok, imagine que você precisa criar uma função que faça a soma de dois números

função Somar (primeiroNumero, segundoNumero) { retorna primeiroNumero + segundo Numero }

Digamos que por algum motivo, é interessante você criar uma variável que receba essa função, porém com apenas um argumento, e depois de alguma outra rotina, você passa o segundo argumento.

variavel novaSoma = Somar(2)

Dependendo da linguagem de programação, o compilador provavelmente interpretará um erro, ou retornar um tipo - como no javascript - NaN (not a number), mas caso pudesse - nativamente - fazer isso, você poderia futuramente chamar essa função passando o outro parâmetro.

novaSoma(3)

E ela retornaria o valor de 5 (2 + 3)

Esse é o bendito processo de Currying - em homenagem a Haskell Curry.

E a notícia boa é que algumas linhas de código você pode trazer isso para o javascript.

Aplicando o cuyrring ao javascript

Agora que você já sabe os dois principais conceitos, você pode utilizá-los no javascript. Da uma olhada no código de exemplo abaixo.

const somar = (x, y) => {
    if (typeof y === "undefined") {
        return function (y) {
            return x + y
        };
    }
 
    return x + y
}

A função basicamente irá checar a existência do segundo argumento, caso os dois argumentos existam, a função executa sua rotina inicial normalmente, mas caso o segundo parâmetro esteja ausente, a rotina cairá em uma condição que caso seja verdadeira (inexistencia do segundo parâmetro), ela irá retornar uma nova função que aguarda apenas um argumento e efetuará a rotina normal.

Exemplos práticos

Com o currying você pode criar funções que "esperam" os argumentos chegarem em qualquer momento do seu código.

const add = somar(2)

E futuramente você pode passar um novo argumento para essa variável que já está salva em memória com a função somar.

add(3)

E o retorno dela será 5.

Quando aplicar o currying

Apesar da técnica ser bastante útil, não é a todo momento que você pode ir acrescentando ao seu código, seria mais interessante em casos que:

  • Você precisa chamar a mesma função várias vezes e com argumentos parecidos ou iguais.
  • Seu código compartilha o mesmo métodos em diferentes momentos do projeto.
  • Quando você precisa criar um contexto compartilhado em todo o projeto.

Obrigado!

Espero que o currying possa ajudar vocês assim como vem me ajudando em alguns projetos!

Até mais!

Carregando publicação patrocinada...
2
1
1
1
1
1
1

Muito interessante, mas nesse caso você tem que replicar a lógica da função original na função que será retornada para a segunda chamada, eu não poderia utilizar recursividade para executar a função com os 2 parâmetros? Tentei aqui, mas ele executa a função em vez de passá-la como retorno.

1

Salve Rafael, exatamente o que você falou. Nesse caso, existem diversas formas de aplicar o currying, desde recursividade, até fazendo checagens com iteração, nesse aspecto é bem flexivel mesmo.

0

Consegui aqui:

const somar = (x, y) => {

  if (typeof y === "undefined") {
      return (y) => somar(x, y);
  }

  return x + y
}

let newSoma = somar(2)

console.log(newSoma(3))