Estoy tratando de crear curry function que se puede aplicar a cualquier función y devolver otra, con 1 de los argumentos aplicados. Propiedades que quieren tener:javascript currying
- Si la función tiene la única función de curry un argumento debe devolver el valor: f (a); curry (f, x) = f (x);
- Si la función tiene muchos argumentos, currey debe recuperar la función curried: g (a1, a2, .., aN); curry (g, x) = g2 (a2, .., aN): g2 (a2, .. aN) = g (x, a2, ..., aN)
- La propiedad de longitud de la función al curry debería funcionar "como sea necesario" g.length = N => Curry (g, x) .length = N-1
Hay algunas implementaciones de curry en Marco Prototype y discusión en one blog. Pero esta implementación no es buena porque no funciona bien en funciones con solo un argumento (1), y también el atributo "longitud" de la función de retorno es 0 (3).
Por primera propiedad no es una aplicación fácil:
function curry(f,x) {
if (f.length == 1) return f(x);
...
}
Pero no sé cómo trabajar con tercera regla, es decir, la función se puede Constucted como función interna, ya que habrá un Medio Ambiente y el léxico anidada podrá usar f:
function curry(f,x) {
return function() { ... }
}
pero en este caso ya no podré establecer explícitamente los parámetros. Por otra función de la mano se puede construir con 'nueva función' declaración, SMTH así:
function curry(f,x) {
var args = [];
for (var i=1; i<f.length; i++) {
args.push('a'+i);
}
var sa = args.join();
return new Function(sa,"return f(x,"+sa+")");
}
Pero en esta situación F y X no unida porque la función anónima se creará en Global léxico Medio Ambiente.
Así que las preguntas:
- ¿Hay alguna manera cuentan parámetros para establecer explícitamente al crear la función con la palabra clave function?
- ¿hay alguna manera de establecer el entorno de la función creado con la instrucción 'nueva función'?
- ¿Hay alguna manera de resolver mi problema de otra manera?
El hecho de que una función sea * declarada * con un solo argumento no significa que no * acepte * más. – Pointy
El primer requisito me parece asimétrico. Currying una función de un argumento debería devolver una función sin argumentos en mi opinión ... – 6502
Sé que si la función declarada con algunos argumentos puede aceptar más, pero de todos modos puede haber una situación en la que quiera verificar el atributo de longitud y la solución romperá esta lógica. No hubo respuesta para 1 y 2 preguntas, pero el problema principal está resuelto, así que marqué la pregunta como resuelta – qnikst