gpt4 book ai didi

java - Java 中的柯里化(Currying)函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:07 28 4
gpt4 key购买 nike

    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

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

如何在 Scala 和 Java 中执行此操作?我可以在 Java 中将 z 声明为隐式吗?提前谢谢你。

最佳答案

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

当您使用上面的语法糖创建柯里化(Currying)函数时,您必须使用 _ 将部分应用的函数分配给一个值。这样您就不会调用该函数,而是创建一个函数值。

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)

关于java - Java 中的柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584966/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com