scala中的咖喱功能

时间:2016-10-24 13:39:46

标签: scala

object answer {
    def product(f:Int=>Int)(a:Int,b:Int):Int =
        if (a>b) 1
        else f(a) * product(f)(a+1,b)   
    product(x=>x*x)(3,4)
    def fact(n:Int) = product(x=>x)(1,n)
}

我可以像这样回答这次执行的结果:

    // 3*3* product(f)(4,4)
    // 3*3 * (4*4) * product(f)(5,4)
    // 3*3 * 4*4 * 1
    // 3*3 * 4*4
    // 144

但是我不理解这段代码 product(f)(a+1,b)任何人都可以向我解释这条线?

3 个答案:

答案 0 :(得分:2)

product是一个递归函数。让我们分析一下。

def product(f:Int => Int)(a: Int, b: Int): Int

product接收f,在这种情况下是IntInt的函数。此外,它还包括ab这两个都是整数。对于此函数,ab将是product函数将应用于的时间间隔。

现在,您不理解的部分是:product(f)(a + 1, b)对。基本上,它的作用是在您将f应用于a后,您需要将f应用于您的时间间隔中的其余值。也就是说,自a完成后,您需要从下一个整数值a + 1开始计算。

答案 1 :(得分:2)

代码块product(f)(a+1,b)是方法product的调用,其参数为:fa+1b

更多详情:

product是一个带有多个参数列表的递归高阶函数。

  • 它是递归的,因为它的身体有一个自己的呼唤。
  • 它是高阶的,因为它将函数作为参数(参见higher-order functions)。
  • 它有两个参数列表(参见currying):
    • 第一个参数由单个参数组成:函数f:Int=>Int;
    • 第二个包含两个参数:a: Intb: Int

答案 2 :(得分:1)

首先,让我们弄清楚什么是咖喱功能。通常,咖喱功能在两个括号中有两个功能参数。当我们指定一个参数时,该函数将返回另一个只有一个参数的函数。例如:

def sumInt1(a: Int)(b: Int): Int = {a + b}
def sumInt2(c: Int): Int = sumInt1(3)(c)
val test = sumInt2(5)  // test: 8

并且,在product(f)(a+1,b)中,仅与上述示例不同的是f是一个函数,并且该函数也可以在scala中被视为参数。