Currying em Javascript

{ March 2nd, 2008 }


cmilfont

Autor: cmilfont

Uma característica de linguagens funcionais muito usada em Javascript é a técnica de Currying, a grosso modo de explicar, usada para transformar uma função com n argumentos em uma outra função com argumentos simples.

1
2
3
4
5
6
7
8
9
 function pow(i, j) { 
     return i * j;
 }
 
 function square (k) {
     return pow(k, 2);
 }
 
 alert(square(6));

Veja nesse exemplo que uma função denominada de pow (que multiplica dois elementos) é usada na função square (que multiplica sempre um elemento por 2) de forma que você tem o uso de primeira pela segunda com uma redução de parâmetros. Essa técnica é usada nas funções de alta ordem como Fold, Map, etc.

1
2
3
4
5
6
7
8
Array.prototype.each = function(fn){
	for(var i = 0, len = this.length; i<len; ++i ) {
		fn.call(this,this[i]);
	}
}
var multiplicar = function(i) { alert(i * 2); }
var teste = [1,2,3];
teste.each(multiplicar);

Exemplo acima usando uma função que aplica outra função para cada elemento de um array.
Essa técnica ficou popular mesmo sendo usada junto a Closure que precisam de funções de callback para processar um resultado de outra função.

Explicando isso em código, teríamos Currying da seguinte forma:

1
2
3
4
5
6
7
8
9
10
11
 function atualizar(id) {
     return function(resposta) {
          document.getElementById(id).innerHTML = resposta;
     };
 }
 
 function processar(msg, fn) {
     fn(msg);
 };
 
processar('testando currying em ação', atualizar('area'));

Na linha 1, temos a declaração de uma função denominada atualizar que recebe um parâmetro em seu construtor que será o id de um elemento qualquer. A chamada a essa função provoca o retorno de uma outra função declarada internamente na linha 3. Essa função interna recebe também um argumento e a função dela é adicionar esse argumento no conteúdo do elemento passado como parâmetro na função inicial. Criei uma função chamada processar apenas para aplicar uma mensagem a um função, será usada para fazer a mágica do Currying aqui. Veja na linha 15 que usei a função processar para submeter uma frase (primeiro argumento) na função atualizar (segundo argumento), passando para ela o id de um elemento como um DIV.

Observe que esse código é muito comum em frameworks ajax, um exemplo claro disso seria como o DWR trabalha.

1
2
3
4
5
 function callback(retorno) {
     alert(retorno);
 }
 
DWRInterface.metodo(callback);

Aqui aplicamos a função callback na função “metodo” que é um método do objeto DWRInterface controlado pelo framework DWR. DEssa forma quando o DWR processar a requisição ajax, submete o retorno vindo do servidor para a função callback que o recebe como parâmetro.
Vamos investigar outras características de linguagens funcionais nos próximos artigos.

Categories: JavaScript, Programação funcional, Web Development ~ ~ Trackback


Assine os comentários deste artigo.


8 Responses to “Currying em Javascript”

  1. 1
    Christiano via Rec6

    Currying em Javascript – CMilfont Tech…

    Conheça essa técnica de programação funcional aplicada a javascript….

  2. 2
    Rafael Ponte

    Bacana, eu uso isso quase que todos os dias e não conhecia esses nomes xiquerrimos :))

  3. 3
    Rafael Carneiro

    É, são técnicas que utilizamos no dia-a-dia e nem sabemos o seu verdadeiro nome. :)

  4. 4
    Tupi.etc.br - Internet com chinelada » Currying com Javascript

    […] é uma tecnica aplicada em linguagens funcionais. O CMilfont Tech explica mais sobre está tecnica e promete explicar mais características das linguagens […]

  5. 5
    Bruno Viana

    “Currying é uma tecnica aplicada em linguagens funcionais. O CMilfont Tech explica mais sobre está tecnica…”

  6. 6
    Edu

    Muuuito interessante!!!

    Eu também não sabia que tinha esse nome.

    Muito bom!!

    Abraços

  7. 7
    Gooder Code

    Function currying in Javascript…

    Do you catch yourself doing something like this often? 1: Ajax.request(‘/my/url’, {‘myParam’: paramVal}, function() { myCallback(paramVal); }); Creating a function which calls another function asynchronously is a bad idea because the value of p……

  8. 8
    JQuery e conflitos - Milfont Consulting

    […] sugestão é utilizarem Closure e Currying para resolver o conflito, isolar o código e deixar bem mais claro. Se ler a documentação lá do […]

Leave a Reply