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