【问题标题】:Currying functions in JavaJava中的柯里化函数
【发布时间】:2015-01-04 02:03:26
【问题描述】:
    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

check(1,2)

不带第三个参数以便以三种方式调用检查

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

如何在 Scala 和 Java 中做到这一点?我可以在 Java 中将 z 声明为隐式吗? 提前谢谢你。

【问题讨论】:

标签: java scala functional-programming currying


【解决方案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)

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多