需要帮助了解使用groovy闭包的currying?

时间:2012-05-09 07:40:23

标签: groovy functional-programming currying

我试图理解currying在函数式编程中是如何工作的。我已经完成了wiki以及关于SO的一些问题。

Need help understanding lambda (currying)

What is 'Currying'?

我理解currying就是将一个带有n个参数的函数分成n个或更少的函数,每个函数都有一个参数。我理论上理解它,但在编码时我无法连接点。也许是因为我缺乏函数式编程语言或C#的知识(正如上面问题中的许多答案所述)。

无论如何,我理解groovy& java的。所以我试着在groovy中得到标准add(a,b)函数的大纲,但我无法完成它。

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

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

有人可以帮我理解使用groovy闭包吗?

2 个答案:

答案 0 :(得分:17)

您可以通过编写一个带有另一个闭包和curried参数来设置的闭包来滚动自己的currying功能,并返回一个使用该值的闭包。

// 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咖喱方法是用词不当,因为它更像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

答案 1 :(得分: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!