2012-05-09 34 views
13

Tôi đang cố gắng hiểu cách thức hoạt động của curry trong lập trình hàm. Tôi đã trải qua wiki và một vài câu hỏi về cùng trên SO.Bạn cần trợ giúp để hiểu việc sử dụng currying bằng cách sử dụng đóng cửa groovy?

Need help understanding lambda (currying)

What is 'Currying'?

Tôi hiểu currying đó là tất cả về việc tách một hàm mang theo n đối số vào n hoặc ít chức năng với một đối số mỗi. Tôi hiểu về mặt lý thuyết nó nhưng tôi không thể kết nối các dấu chấm trong khi mã hóa cho cùng một. Có lẽ đó là sự thiếu kiến ​​thức của tôi trong các ngôn ngữ lập trình hàm hoặc C# (như nhiều câu trả lời trong các câu hỏi trên giải quyết).

Dù sao, tôi hiểu rõ ràng về trình biên dịch & java. Vì vậy, tôi đã cố gắng để có được một phác thảo cho các chức năng tiêu chuẩn add(a,b) trong groovy nhưng tôi không thể hoàn thành nó.

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

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

Ai đó có thể giúp tôi hiểu cà ri bằng cách sử dụng đóng cửa không?

+3

Tôi nói về Lập trình chức năng với Groovy trong hội nghị. Bạn có thể xem [slide về currying với Groovy] (http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

Đã đi qua tất cả các trang trình bày. Một thông tin rất hay. :) –

Trả lời

17

Bạn có thể cuộn chức năng currying của mình bằng cách viết một đóng cửa mà có một đóng cửa và một tham số curried để thiết lập, và trả về một đóng cửa có sử dụng giá trị này.

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

Nhưng bạn nên gắn bó với phương thức Groovy curry sẵn có as shown by jalopaba. (cũng có rcurryncurry mà cà ri từ bên phải, và tại một vị trí nhất định tương ứng)

Phải nói rằng phương pháp cà ri Groovy là một từ sai vì nó là nhiều hơn một trường hợp partial application vì bạn không cần để đi đến một kết thúc chỉ yêu cầu một thông số duy nhất, tức là:

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 để có giải thích toàn diện hơn so với tôi :-) – jalopaba

10

Bạn có thể đặt một giá trị cố định cho một hoặc nhiều đối số cho một trường hợp đóng cửa bằng cách sử dụng curry() phương pháp:

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

Một ví dụ khác:

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! 
Các vấn đề liên quan