Java中的Currying函数

时间:2014-12-20 22:34:47

标签: java scala functional-programming currying

    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中的隐式吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

当您使用上面的语法糖创建curried函数时,您必须使用_将部分应用的函数指定给值。这样您就不会调用该函数,而是创建一个函数值。

val z = curried(0,0) _

但是,如果你不使用语法sugar:

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)