Currying

Currying toma una función

f: X * Y -> R

y lo convierte en una función

f’: X -> (Y -> R)

En lugar de llamar f con dos argumentos, invocamos f’ con el primer argumento. El resultado es una función que entonces llamamos con el segundo argumento para producir el resultado. Por lo tanto, si el f no es comparable se invoca como

f(3,5)

entonces el f’ comparables es invocada como

f(3)(5)

Por ejemplo: Uncurried add()


function add(x, y) {
  return x + y;
}

add(3, 5);   // returns 8

Curried add()

function addC(x) {
  return function (y) {
    return x + y;
  }
}

addC(3)(5);   // returns 8

El algoritmo para currying.

Curry toma una función binaria y devuelve una función unaria, función que devuelve una función unaria.

curry: (X × Y → R) → (X → (Y → R))

Codigo Javascript:

function curry(f) {
  return function(x) {
    return function(y) {
      return f(x, y);
    }
  }
}

Partial application

Partial application toma una funcion

f: X * Y -> R

y un valor fijo para el primer argumento para producir una nueva función

f`: Y -> R

f’ hace lo mismo que f, pero sólo tiene que completar el segundo parámetro.

Por ejemplo: almacenando el primer argumento de la función de añadir a 5 resulta la función más 5.

function plus5(y) {
  return 5 + y;
}

plus5(3);  // returns 8

El algoritmo de partial application.

partApply toma una función y un valor binario y produce una función unaria.

partApply : ((X × Y → R) × X) → (Y → R)

Codigo Javascript:

function partApply(f, x) {
  return function(y) {
    return f(x, y);
  }
}