2012-05-09 15 views
13

Estoy tratando de entender cómo funciona el currying en la programación funcional. He pasado por wiki y un par de preguntas sobre el mismo en SO.¿Necesita ayuda para entender el currículum utilizando cierres maravillosos?

Need help understanding lambda (currying)

What is 'Currying'?

entiendo que currificación tiene que ver con la división de 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. Tal vez 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 & java. Así que traté de obtener un esquema para la función estándar add(a,b) en groovy pero no pude terminarlo.

def closure = { arg -> 
    // ?? 
} 

def add(anotherClosure , a){ 
    return closure // ?? 
} 

¿Alguien puede ayudarme a entender el currying usando cierres de Groovy?

+3

Hablo de programación funcional con Groovy en una conferencia. Puede ver las [diapositivas sobre currying con Groovy] (http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

Pasé por todas las diapositivas. Una muy buena información. :) –

Respuesta

17

Usted puede rodar su propia funcionalidad currificación por escrito 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 usted es mejor quedarse con el método incorporado maravilloso curryas shown by jalopaba. (También hay rcurry y ncurry el que el curry desde la derecha, y en una posición dada, respectivamente)

Hay que decir, que el método de curry Groovy es un nombre inapropiado, ya que es más un caso de partial application como que no es necesario para llegar a un cierre que requiere 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 
+2

+1 para una explicación mucho más completa que la mía :-) – jalopaba

10

se puede establecer un valor fijo para uno o más argumentos a una instancia de cierre mediante el curry() método:

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! 
Cuestiones relacionadas