2012-05-09 37 views
13

我想了解如何在函數式編程中起作用。我已經通過wiki和幾個關於SO的問題。需要幫助理解使用groovy關閉的咖喱?

Need help understanding lambda (currying)

What is 'Currying'?

我明白,鑽營是所有關於拆分函數,有n個參數爲n個或更少的功能,每一個參數。我在理論上理解它,但是我不能在編碼相同的情況下連接點。也許這是我對函數式編程語言或C#缺乏瞭解的知識(上述問題中的很多答案都是這樣處理的)。

無論如何,我理解groovy & java。所以我試圖在groovy中獲得標準add(a,b)函數的大綱,但我無法完成它。

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

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

有人能幫助我理解使用groovy關閉的currying嗎?

+3

我在會議中討論了使用Groovy進行函數式編程。你可以看到[與Groovy有關的幻燈片](http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

瀏覽了所有的幻燈片。一條非常好的信息。 :) –

回答

17

您可以通過書面形式推出自己的鑽營功能一個使用另一個閉包和一個curried參數來設置的閉包,並返回一個使用此值的閉包。

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

但你是用內置的Groovy curry方法as shown by jalopaba更好的癥結。 (也有rcurryncurry從右邊咖喱,並且在給定的位置分別)

應該說,這Groovy的curry方法是用詞不當,因爲它更多的是因爲你並不需要的partial application情況關閉只需要一個參數,即:

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比我的更全面的解釋:-) – jalopaba

10

可以使用curry()方法的一個或多個參數設置一個固定值,以將閉合實例:

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

又如:

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!