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))

Conteúdo excluído
1

Acredito que em partes, Natanael. A memoizaçã, em conceito, atrela o seu sentido a funções puras e não puras - geralmente relacionado ao retorno x argumentos - a forma de se criar um objeto, ou qualquer outro tipo viável, para realiar a função de um "cache".

Já o currying está muito mais a nível de função, onde aquela função específica pode - também - fazer um "holding" de parametros que podem ser passados em momentos futuros.

Mas no final das contas, as duas formas acabam compartilhando esse sentido de guardar um valor para ser acessado e modificado em qualquer momento.