groovy
Currying
Recherche…
Syntaxe
- closing.curry (paramètre)
- closure.rcurry (paramètre)
- closure.ncurry (index, paramètres ...)
Remarques
Currying une fermeture produit une nouvelle fermeture avec un ou plusieurs de ses paramètres ayant une valeur fixe
Currying gauche ou droit d'une fermeture qui n'a pas de paramètres ou basée sur l'index curing d'une fermeture qui a moins de deux paramètres lève une
IllegalArgumentException
Curry gauche
def pow = { base, exponent ->
base ** exponent
}
assert pow(3, 2) == 9
def pow2 = pow.curry(2) //base == 2
assert pow2(3) == 8
Droit currying
def dividable = { a, b ->
a % b == 0
}
assert dividable(2, 3) == false
assert dividable(4, 2) == true
def even = dividable.rcurry(2) // b == 2
assert even(2) == true
assert even(3) == false
Curry basé sur index
def quatNorm = { a, b, c, d ->
Math.sqrt(a*a + b*b + c*c + d*d)
}
assert quatNorm(1, 4, 4, -4) == 7.0
def complexNorm = quatNorm.ncurry(1, 0, 0) // b, c == 0
assert complexNorm(3, 4) == 5.0
Fermeture de curry sans paramètre explicite
def noParam = {
"I have $it"
}
def noParamCurry = noParam.curry(2)
assert noParamCurry() == 'I have 2'
Fermeture de curry sans paramètres
def honestlyNoParam = { ->
"I Don't have it"
}
// The following all throw IllegalArgumentException
honestlyNoParam.curry('whatever')
honestlyNoParam.rcurry('whatever')
honestlyNoParam.ncurry(0, 'whatever')
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow