2010-04-27 8 views
9

Por lo tanto, mi comprensión del currying (basada en las preguntas SO) es que le permite establecer parcialmente los parámetros de una función y, como resultado, devolver una función "truncada".¿Es el currying solo una forma de evitar la herencia?

Si usted tiene una función grande y peludo toma 10 parámetros y se parece a

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) { 
    //weird stuff 
} 

y desea una función de "subconjunto" que le permitirá lidiar con ajustes predeterminados para todos, pero el jumpShot%, si no que simplemente ¿Salir de una clase que hereda de la función original?

Supongo que lo que estoy buscando es un caso de uso para este patrón. ¡Gracias!

Respuesta

1

en JavaScript que hago currying en las funciones de devolución de llamada (porque no se pueden pasar ningún parámetro después se les llama (de la persona que llama)

Así que algo como:

... 
var test = "something specifically set in this function"; 
onSuccess: this.returnCallback.curry(test).bind(this), 

// This will fail (because this would pass the var and possibly change it should the function be run elsewhere 
onSuccess: this.returnCallback.bind(this,test), 
... 

// this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry 
returnCallback: function(thePassedVar, ajaxResponse){ 
    // now in here i can have 'thePassedVar', if 
} 

no estoy seguro de si que fue detallado o suficientemente coherente ... pero currying básicamente le permite 'rellenar' los parámetros y devolver una llamada de función vacía que ya tiene datos llenos (en lugar de requerir que complete esa información en otro punto)

5

Currying has muchos usos. Desde sim Especifique los parámetros predeterminados para las funciones que usa a menudo para devolver funciones especializadas que sirven para un propósito específico.

Pero te voy a dar este ejemplo:

function log_message(log_level, message){} 
log_error = curry(log_message, ERROR) 
log_warning = curry(log_message, WARNING) 

log_message(WARNING, 'This would be a warning') 
log_warning('This would also be a warning') 
1

Al programar en un estilo funcional, a menudo se enlaza argumentos para generar nuevas funciones (en este ejemplo, predicados) de edad. Pseudo-código:

filter(bind_second(greater_than, 5), some_list) 

podría ser equivalente a:

filter({x : x > 5}, some_list) 

donde {x : x > 5} es una definición de la función anónima. Es decir, construye una lista de todos los valores de some_list que son mayores que 5.

0

En muchos casos, los parámetros a omitir no se conocerán en tiempo de compilación, sino en tiempo de ejecución. Además, no hay límite para la cantidad de delegados curried que pueden existir para una función determinada. Lo siguiente es una adaptación de un programa del mundo real.

Tengo un sistema en el que envío paquetes de comando a una máquina remota y recibo paquetes de respuesta. Cada paquete de comando tiene un número de índice, y cada respuesta lleva el número de índice del comando del cual es una respuesta. Un comando típico, traducido al inglés, podría ser "dame 128 bytes comenzando en la dirección 0x12300". Una respuesta típica podría ser "Exitosa". junto con 128 bytes de datos.

Para manejar la comunicación, tengo una rutina que acepta una cantidad de paquetes de comando, cada uno con un delegado. A medida que se recibe cada respuesta, el delegado correspondiente se ejecutará en los datos recibidos. El delegado asociado con el comando anterior sería algo así como "Confirme que obtuve un 'éxito' con 128 bytes de datos, y si es así, guárdelos en mi búfer en la dirección 0x12300". Tenga en cuenta que múltiples paquetes pueden estar pendientes en un momento dado; el parámetro de dirección al curry es necesario para que la rutina sepa a dónde deben ir los datos entrantes.Incluso si quisiera escribir una rutina de "almacenar datos en el búfer" que no requiriera un parámetro de dirección, no tendría forma de saber a dónde deberían ir los datos entrantes.

Cuestiones relacionadas