2012-05-09 14 views
13

İşlevsel programlamanın nasıl çalıştığını anlamaya çalışıyorum. wiki'dan geçtim ve SO ile ilgili olarak birkaç soru sordum.Mükemmel kapanışları kullanarak körlemeyi anlamada yardıma mı ihtiyacınız var?

What is 'Currying'?

Need help understanding lambda (currying)

O tımar hepsi bir argüman her n ya da daha az fonksiyonları içine n argüman alan bir fonksiyon bölme hakkındadır anlıyoruz. Teorik olarak anladım ama aynı kodları yazarken noktaları birleştiremiyorum. Belki de işlevsel programlama dillerinde veya C# 'da (yukarıdaki soruların cevaplarının çoğunda olduğu gibi) bilgi eksikliğim olabilir.

Neyse, & java'yı anlıyorum. Bu yüzden standart add(a,b) işlevi için bir taslak oluşturmaya çalıştım ama bitiremedim.

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

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

Birisi, mükemmel bir şekilde kapatmayı kullanarak küfürlenmeyi anlamama yardımcı olabilir mi?

+3

Konferansta Groovy ile İşlevsel Programlama hakkında konuşuyorum. [Groovy ile körleme hakkında slaytlar] görebilirsiniz (http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

Tüm slaytlar boyunca gitti. Çok güzel bir bilgi parçası. :) benim için çok daha kapsamlı bir açıklama için –

cevap

17

Bunu yazılı yaparak kendi tımar işlevselliği dönebilirsiniz Başka bir kapanış ve ayarlanmış bir curried parametresi alan bir kapanma ve bu değeri kullanan bir kapanma döndürür.

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

Ama dahili Groovy curry yöntemle as shown by jalopaba iyi yapışmasını konum. Eğer gerekmez olarak partial application daha olgusu olduğu gibi Groovy köri yöntemi yanlış adlandırma olduğunu,

Denilebilir olmalıdır (aynı zamanda sağdan köri ve sırasıyla belirli bir pozisyonda rcurry ve ncurry yoktur) Yalnızca tek bir parametre gerektiren bir kapatma işlemine geçmek için, örneğin:

+2

+1 – jalopaba

10

Sen curry() yöntemini kullanarak bir kapatma örneğine bir veya birden fazla bağımsız değişkenler için sabit bir değer ayarlayabilirsiniz:

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

Başka bir örnek:

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!