2012-05-09 19 views
13

Próbuję zrozumieć, jak działa currying w programowaniu funkcjonalnym. Przeszedłem przez wiki i kilka pytań dotyczących tego samego na SO.Potrzebujesz pomocy w zrozumieniu curry przy użyciu groovy closures?

Need help understanding lambda (currying)

What is 'Currying'?

I zrozumieć, że Zmiękczanie polega na rozdzieleniu funkcję, której argumentami w funkcji n N lub mniej z jednej każdy argument. Teoretycznie rozumiem to, ale nie mogę połączyć kropek podczas kodowania tego samego. Być może jest to mój brak wiedzy w językach programowania funkcjonalnego lub C# (jak wiele odpowiedzi w powyższych pytaniach dotyczy).

W każdym razie rozumiem groovy & java. Tak więc starałem się uzyskać zarys standardowej funkcji add(a,b), ale nie mogłem jej ukończyć.

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

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

Czy ktoś może mi pomóc w zrozumieniu curry przy użyciu groovowych zamknięć?

+3

Mówię o programowaniu funkcjonalnym z Groovy w konferencji. Możesz zobaczyć [slajdy o curry z Groovy] (http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

Przeszedłem przez wszystkie slajdy. Bardzo dobra informacja. :) –

Odpowiedz

17

Można toczyć swoją funkcjonalność currying przez piśmie zamknięcie, które ma inne zamknięcie i ustawiony parametr, i zwraca zamknięcie, które używa tej wartości.

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

Ale jesteś lepszy kłucia z wbudowanym Groovy curry metody as shown by jalopaba. (Istnieje również rcurry i ncurry który curry z prawej strony, a na danym stanowisku odpowiednio)

należy stwierdzić, że Groovy metoda curry jest mylące, ponieważ jest to bardziej przypadek partial application jak nie trzeba aby przejść do zamknięcia wymagającego tylko jednego parametru, tj .:

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 za znacznie bardziej wyczerpujące wyjaśnienie niż moje :-) – jalopaba

10

można ustawić stałą wartość dla jednego lub więcej argumentów na przykład zamknięcia stosując metodę curry():

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

Inny przykład:

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! 
Powiązane problemy