scala中currying的语法是例如
def f(x: Int, b: Int) = x + y
是
def f(x: Int)(b: Int) = x + y
并且对于给定范围a和b的求和总和是
def sum(f: Int => Int, a: Int, b: Int) = {
...
}
sum(x=>x, 3, 6) // outcome is 18 (3+4+5+6)
是
def sum(f: Int => Int): (Int, Int) => Int = {
def sumF(a: Int, b: Int): Int =
if (a > b) 0
else f(a) + sumF(a + 1, b)
sumF
}
sum(x=>x)(3, 6) // outcome is 18 (3+4+5+6)
但我不明白为什么冒号(:) 存在于(f:Int => Int)和(Int,Int)
之间def sum(f: Int => Int): (Int, Int) => Int = {
中的
而不是
def sum(f: Int => Int)(Int, Int) => Int = {
答案 0 :(得分:2)
您的sum
示例不咖喱。如果你想要它,你会做类似的事情:
def sum(f: Int => Int)(a: Int, b: Int): Int =
if (a > b) 0
else f(a) + sum(f)(a + 1, b)
sum(x=>x)(3, 6) // res0: Int = 18
您的代码定义了一个采用单个参数def sum(f: Int => Int)
的方法。该参数是一个函数,它接受Int
并返回Int
。所以没有涉及到currying。
此sum
方法返回一个函数: (Int, Int) => Int
。此返回的函数需要2 Int
s并返回Int
。调用此sum
方法看起来像是currying,但事实并非如此。
sum(x=>x)(3, 6)
相反,您使用单个参数(sum()
)调用x=>x
,然后使用两个参数(3,6
)调用返回的函数。
答案 1 :(得分:1)
(Int, Int) => Int
和:
之间的 =
指定了函数的返回类型,即它表示sum
将返回另一个签名方法(Int, Int) => Int
,该方法需要两个{ {1}}并返回另一个Int
,这是内部Int
函数的签名:
您可以将其重写为currying语法,如下所示:
sumF
这或多或少与OP中定义的方法相同:
def sum(f: Int => Int)(a: Int, b: Int): Int = {
def sumF(a: Int, b: Int): Int =
if (a > b) 0
else f(a) + sumF(a + 1, b)
sumF(a, b)
}
但是这两个定义并不完全相同,例如,对于此处定义的currying语法,如果要从中生成新方法,则必须指定变量类型,如:
sum(x => x)(3, 6)
// res11: Int = 18
但是对于OP中的那个,它可以简单地val mysum: (Int, Int)=> Int = sum(x => x)
作为已经指定的val mysum = sum(x => x)
的返回类型。