Каррирование функций в Java

    def check( x: Int, y: Int) (z: Int) = {
        x+y+z
    }                                 //> check: (x: Int, y: Int)(z: Int)Int

    def curried = check _             //> curried: => (Int, Int) => Int => Int
    def z = curried(0,0)              //> z: => Int => Int

    z(3)                              //> res0: Int = 3
    check(1,2)(3)                     //> res1: Int = 6
    check(1,2)(_)                     //> res2: Int => Int = <function1>

У меня есть этот код в Scala, и я пытаюсь добиться такого вызова проверки

check(1,2)

без третьего параметра, чтобы вызвать проверку тремя способами

check(1,2)(3) // with three parameters 
z(3)          // with just one and 
check(1,2) with two parameters. 

Как я могу сделать это в Scala и Java? Могу ли я объявить z как неявный в Java? Заранее спасибо.


person jimakos17    schedule 20.12.2014    source источник
comment
возможный дубликат Поддерживает ли java каррирование?   -  person Alexis King    schedule 21.12.2014
comment
Я знаю об этом посте, но, к сожалению, не помог мне понять, как это сделать.   -  person jimakos17    schedule 21.12.2014


Ответы (1)


def check( x: Int, y: Int) (z: Int)

Когда вы используете приведенный выше синтаксический сахар для создания каррированных функций, вы должны использовать _, чтобы присвоить частично примененной функции значение. Таким образом, вы не вызываете функцию, а вместо этого создаете значение функции.

val z = curried(0,0) _

Однако, если вы не используете синтаксический сахар:

def check( x: Int, y: Int) = (z:Int) => x+y+z

Затем вы можете назвать это так, как хотите:

check(1,2)    //res2: Int => Int = <function1>
z(3)          // res3: Int = 6
check(1,2)(3) // res4: Int = 6

Обратите внимание, что вам не нужно использовать _, например, для передачи результата частично примененной функции в качестве параметра другой функции.

def filter(xs: List[Int], p: Int => Boolean): List[Int] =
    if (xs.isEmpty) xs
    else if (p(xs.head)) xs.head :: filter(xs.tail, p)
    else filter(xs.tail, p)

def modN(n: Int)(x: Int) = ((x % n) == 0)

filter(List(1,2,3,4,5), modN(2)) //res6: List[Int] = List(2, 4)
person Breno Ferreira    schedule 03.01.2015