2012-05-09 10 views
13

Sto cercando di capire come funziona il currying nella programmazione funzionale. Ho attraversato wiki e un paio di domande sullo stesso su SO.Hai bisogno di aiuto per capire come utilizzare le chiusure groovy?

Need help understanding lambda (currying)

What is 'Currying'?

capisco che currying è tutto dividere una funzione che prende n argomenti in n funzioni o meno con un argomento ciascuna. Te lo comprendo teoricamente, ma non sono in grado di collegare i punti durante la codifica per lo stesso. Forse è la mia mancanza di conoscenza nei linguaggi di programmazione funzionale o C# (come molte risposte nelle domande precedenti trattano).

In ogni caso, capisco groovy & java. Così ho cercato di ottenere uno schema per la funzione standard add(a,b) in groovy, ma non ho potuto terminarlo.

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

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

Qualcuno può aiutarmi a capire currying utilizzando chiusure groove?

+3

Parlo di programmazione funzionale con Groovy in una conferenza. Puoi vedere le [diapositive sul curry con Groovy] (http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

Sono andato a tutte le diapositive. Una bella informazione. :) –

risposta

17

si può rotolare le proprie funzionalità accattivarsi scrivendo una chiusura che richiede un'altra chiusura e un parametro al curry da impostare e restituisce una chiusura che utilizza questo valore.

// 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') 

Ma si sta meglio attaccare con il integrato Groovy curry metodo as shown by jalopaba. (C'è anche rcurry e ncurry che curry da destra, e in una data posizione, rispettivamente)

va detto, che il metodo di curry Groovy è un termine improprio in quanto è più un caso di partial application come non è necessario per arrivare a una chiusura che richiede solo un singolo parametro, ovvero:

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 per una spiegazione molto più completa della mia :-) – jalopaba

10

è possibile impostare un valore fisso per uno o più argomenti a un'istanza di chiusura utilizzando il metodo curry():

def add = { a, b -> a + b } 
def addFive = add.curry(5) 
addFive(3) // 5 + 3 = 8 

Un altro esempio:

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! 
Problemi correlati