Scala:进行currying时的函数声明

时间:2018-12-06 14:26:43

标签: scala

我正在学习Scala,但我不太了解:

  1. 为什么sum2不能重写代码sum1?

  2. 为什么在sum1中,a和b自动知道(Int,Int)对应于a和b?

谢谢。

    def sum1 (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
    }

    def sum2 (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
    }

1 个答案:

答案 0 :(得分:3)

  1. 这是因为sum1sum2具有不同的接口:sum1(Int => Int) => ((Int, Int) => Int),而sum2(Int => Int, Int, Int) => Int。即sum1返回接受两个整数并返回一个整数的函数。但是sum2仅返回一个整数值,而不是一个函数。

  2. 您的sumF函数等于lambda函数

    val sumF: (Int, Int) => Int = (a: Int, b: Int) => {
        if (a > b)
            0
        else
            f(a) + sumF(a + 1, b)
    }
    

    如果您尝试将sumF保存为值(看起来像val tmp: (Int, Int) => Int = sumF),就可以看到它