variable - ¿Necesitas ayuda para entender el currying usando groovy closures?
groovy when then (2)
Puede desplegar su propia funcionalidad de curritura escribiendo un cierre que toma otro cierre y un parámetro curried para establecer, y devuelve un cierre que usa este valor.
// Our closure that takes 2 parameters and returns a String
def greet = { greeting, person -> "$greeting $person" }
// This takes a closure and a default parameter
// And returns another closure that only requires the
// missing parameter
def currier = { fn, param ->
{ person -> fn( param, person ) }
}
// We can then call our currying closure
def hi = currier( greet, ''Hi'' )
// And test it out
hi( ''Vamsi'' )
Pero es mejor seguir con el método de Groovy curry
incorporado como se muestra en jalopaba . (También hay rcurry y ncurry que curry desde la derecha, y en una posición determinada, respectivamente)
Debería decirse que el método de curry Groovy es un nombre inapropiado ya que es más un caso de aplicación parcial, ya que no es necesario llegar a un cierre que requiera solo un parámetro, es decir:
def addAndTimes = { a, b, c -> ( a + b ) * c }
println addAndTimes( 1, 2, 3 ) // 9
def partial = addAndTimes.curry( 1 )
println partial( 2, 3 ) // 9
Estoy tratando de entender cómo funciona el currying en la programación funcional. He revisado el wiki y un par de preguntas sobre el mismo en SO.
Necesita ayuda para entender lambda (currying)
Entiendo que currying se trata de dividir una función que toma n argumentos en n o menos funciones con un argumento cada uno. Teóricamente lo comprendo pero no puedo conectar los puntos mientras codifico el mismo. Quizás es mi falta de conocimiento en lenguajes de programación funcionales o C # (como tratan muchas respuestas en las preguntas anteriores).
De todos modos, entiendo groovy y java. Así que traté de obtener un esquema para la función de add(a,b)
estándar en groovy pero no pude terminarlo.
def closure = { arg ->
// ??
}
def add(anotherClosure , a){
return closure // ??
}
¿Alguien puede ayudarme a entender el currying usando cierres maravillosos?
Puede establecer un valor fijo para uno o más argumentos en una instancia de cierre utilizando el método curry()
:
def add = { a, b -> a + b }
def addFive = add.curry(5)
addFive(3) // 5 + 3 = 8
Otro ejemplo:
def greeter = { greeting, name -> println "${greeting}, ${name}!" }
def sayHello = greeter.curry("Hello")
sayHello("Vamsi") // Hello, Vamsi!
def sayHi = greeter.curry("Hi")
sayHi("Vamsi") // Hi, Vamsi!