2014-12-20 2 views
3
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 и то, что я пытаюсь добиться, чтобы позвонить и проверить таким образомКарринг функции в Java

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? Спасибо заранее.

+1

возможно дубликат [Есть ли поддержка Java Карринг?] (Http://stackoverflow.com/questions/6134278/does-java-support-currying) –

+0

Я знаю эту должность, но, к сожалению, не сделал помогите мне понять, как это сделать. – jimakos17

ответ

2
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) 
Смежные вопросы