w3schools valor una tipos retornar pasar parametros funciones funcion desde anonimas anidadas javascript functional-programming

valor - ¿Admite JavaScript la aplicación de función parcial?



retornar valor de una funcion javascript (4)

Como se señala en las otras respuestas, lo que describes es currying; es una forma de aplicación parcial, como lo identifica.

Sin embargo, si lo que desea es solo una aplicación parcial, puede usar underscore.js, que agrega muchas utilidades de programación funcional: http://documentcloud.github.com/underscore/

Al leer el artículo de Wikipedia sobre las funciones de primera clase, hay una buena tabla de soporte de idiomas para varios aspectos de la programación funcional: http://en.wikipedia.org/wiki/First-class_function#Language_support

JavaScript se enumera como que no tiene una aplicación de función parcial. Sin embargo, existen técnicas para crear una función que devuelve una función que con algunos de los parámetros almacenados en un cierre, es decir:

var add = function(a, b){ return a + b; }, apply = function(fn, a){ return function(b){ return fn(a, b); } }, addFive = apply(add, 5); console.log(addFive(2)); // prints 7

¿No es esta una aplicación de función parcial? De lo contrario, ¿podría alguien proporcionar un ejemplo de aplicación de función parcial en otro idioma y explicar cómo es diferente?

¡Gracias!


El concepto que debe buscar para entender esto se llama currying (después de Haskell B. Curry). Existe un isomorfismo entre las funciones de los parámetros n + 1 y una función con un parámetro que devuelve una función con n parámetros. Si aplica esto recursivamente, puede escribir una función de cualquier número de parámetros como una función para funcionar con funciones.

Esta es la razón por la cual las funciones en lenguajes funcionales usualmente se escriben como X -> Y -> Z , es decir, es una función que toma una X y devuelve una función tomando una Y retorna una Z Esta firma también significa que solo puede proporcionar una X y la función devolverá una función.

En Javascript, una función de dos parámetros tendrá la firma X * Y -> Z lo que significa que es una función que toma un par de X * Y y devuelve una Z Sin embargo, no puedes suministrar la mitad de un par.

Hay dos formas de salir de esto:

  • Siempre curry manualmente su función. Su función de add podría escribirse como:

    var curryadd = function(a){ return function(b){ return a + b; } };

Con esto ahora tiene una función que tiene el firmante Int -> Int -> Int que se necesita para la aplicación de función parcial. Sin embargo, también debe asegurarse de llamar a esta función como curryadd(5)(10) que no es natural.

  • Proporcione funciones de orden superior, que curry sus funciones. En su caso, la aplicación hace dos cosas, curry su función de agregar y vincula el parámetro. Esto se puede dividir en dos partes:

    var curry = function(fn) { return function(a){ return function(b){ return fn(a,b); } } };

Esto realmente implementará el isomorfismo entre funciones con pares como argumentos y funciones que devuelven funciones. También hay una manera de escribir " uncurry que hace lo mismo al revés.

Debido a que tiene que hacer todo esto manualmente y no hay soporte de idioma directo, se dice que javascript no tiene una aplicación de función parcial (lo que no significa que no pueda agregarlo al idioma).


Lo que muestra es un ejemplo de funciones de orden superior, funciones que toman funciones como argumentos y / o funciones de retorno.

La aplicación parcial es algo diferente. Aquí un ejemplo de Haskell :

add :: Int -> Int -> Int add x y = x + y addOne = add 1

add es una función que toma dos Int y devuelve un Int , denotado como Int -> Int -> Int . Si no está familiarizado con la sintaxis, en Javascript esto sería más o menos así:

/** * @param int x * @param int y * @return int */ function add(x, y) { return x + y; }

add 1 llama a esta función con un solo parámetro, que devuelve una nueva función que toma un Int y devuelve un Int ( Int -> Int ). La función de add no fue diseñada explícitamente para ser una función de orden superior, simplemente se aplicó parcialmente.


var func1 = function(a, b) { return a + b; } var func2 = func1.bind(undefined, 3); func2(1); // 4 func2(2); // 5 func2(3); // 6

consultar documentos en developer.mozilla.org