在scala中调整语法

时间:2017-02-20 17:04:00

标签: scala currying

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 = {

2 个答案:

答案 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)的返回类型。