Escovando

Escovando

> Tutorial LeekScript

*Esta página está parcialmente obsoleta. No Leekscript, o currying é usado apenas para tornar o código mais legível, não economiza mais operações, pois o custo de uma chamada a uma função é reduzido a 1, independentemente do número de parâmetros. *

Na programação funcional, currying refere-se à operação que leva uma função multi-argumento para uma função de um argumento e retorna uma função que leva o resto dos argumentos. A operação inversa é obviamente possível e é chamada de decurrificação.

O termo vem do nome do matemático americano Haskell Curry.

Exemplo em Leekscript

Vamos pegar uma função que recebe 2 argumentos e retorna a soma dos 2:

função adicionar(x, y) { retornar x+y; }

Transforma-se em método curry

função add_curried(x) { função de retorno(y) { retornar x+y; }; }

Exemplo de uso

//método clássico var soma = soma(1, 3);

//método curry var add1 = add_curried(1); var soma = add1(3);

Este exemplo é apenas para mostrar como funciona, neste caso não faz sentido passar por currying. Vejamos outro exemplo mais interessante. Imagine que temos um array de n elementos numéricos e queremos somar 1 a todos os elementos.

//método clássico for(chave var: elemento var no array) { array[chave] = add(1, item); }

//método curry var add1 = add_curried(1); for(chave var: elemento var no array) { array[chave] = add1(elemento); }

A vantagem aqui é vista em termos de otimização, no loop ao invés de chamar uma função com 2 parâmetros, chamamos apenas uma função com um parâmetro. Quanto maior o número de elementos na matriz, maior o ganho.

Quando vale a pena currying?

Como vimos anteriormente, o uso principal é para funções chamadas em loops e um ou mais cujos parâmetros não dependem do loop. Memoization é um exemplo perfeito de uso.

Tomemos, por exemplo, nossa função lineOfSight com memoização (definida aqui):

Se chamarmos essa função em um loop, as duas operações nos sobrecarregarão! A Currificação pode nos ajudar:

Nossa função retorna outra função, que pode usar os parâmetros da primeira, é um pouco difícil de entender na primeira vez, mas bem usado esse método é muito eficaz! Um pequeno exercício: podemos otimizar ainda mais essa função, cabe a você descobrir como!