我试图了解柯里化(Currying)在函数式编程中的工作原理。我已经经历过wiki还有几个关于SO的相同问题。
Need help understanding lambda (currying)
我知道柯里化(Currying)就是将一个带有 n 个参数的函数拆分为 n 个或更少的函数,每个函数只有一个参数。我从理论上理解它,但在编码时无法将这些点连接起来。也许是我缺乏函数式编程语言或 C# 的知识(正如上述问题中的许多答案所涉及的那样)。
无论如何,我了解 groovy 和 java。所以我试图获得 groovy 中标准 add(a,b)
函数的大纲,但我无法完成它。
def closure = { arg ->
// ??
}
def add(anotherClosure , a){
return closure // ??
}
有人可以帮助我理解使用常规闭包进行柯里化(Currying)吗?
最佳答案
您可以通过编写一个闭包来推出自己的柯里化(Currying)功能,该闭包接受另一个闭包和一个柯里化(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 。 (还有 rcurry 和 ncurry 分别从右侧柯里化(Currying),并在给定位置柯里化(Currying))
应该说,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
关于groovy - 需要帮助理解使用常规闭包的柯里化(Currying)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511779/