2014-05-19 73 views
0

w.r.t柯里斯卡拉,部分我理解下面的示例代码。柯达在斯卡拉

def product1(f:Int => Int)(a:Int, b:Int):Int = { 
     println() 
     if(a > b) 1 
     else 
     f(a) * product1(f)(a+1, b) 
     } 

product(x => x * x) (3, 4) 

出来的,我与

产品1(F)

product1(f)(a+1, b) 

有点糊涂只是需要解释发生的事情在这里。 ... :(以及如何在解释时口头发音...

在此先感谢..

+1

无数次,多个参数列表都与* currying无关*! –

+2

我的意思是,我不会说*没有* – acjay

回答

3

product1有两个参数列表。 product1(f)f的应用,其是种类Int => Int的功能。如果你仅仅调用product1(f)像这样:

product1(f) 

没有第二个参数列表,你会得到一个所谓的部分应用的功能,即一个函数,它不具有所有参数的约束(你仍然需要提供它ab

0

看参数声明:

f:Int => Int 

f是一个Int映射到一个int功能 - 它需要一个int参数,并返回一个int。举例如下:

x => x * x 

返回其参数的平方。

product1(x => x * x) (3, 4) 

返回f的产物(3).. F(4)= 3 * 3 * 4 * 4

顺便说一句,这是不是真的讨好的一个例子,由于所有的参数都是给出。钻营会像

VAL prodSquare =产品1(X => X * X)

然后,

prodSquare(1, 5) 

产量1 * 1 * 2 * 2 * 3 * 3 * 4 * 4 * 5 * 5

0

对于我见过的大多数习惯用途,你也可以想象你的函数只有一个参数列表。多个参数列表主要用于泛型函数中的类型推断目的,因为类型推断一次完成一个参数列表,而不是使用Hindley-Milner/Algorithm W一次推断所有类型。其他一些语言特性适用于单个参数列表,例如implicit参数和隐式使用大括号代替单参数列表的括号等。

具有多个参数列表的函数以类似于咖喱的方式调用函数从语法的角度来看,但是默认情况下,中间函数不会被创建。在完全curried风格中,每个函数最多只有一个参数,并返回一个结果(可能碰巧是另一个函数,需要参数等等)。从技术上讲,讨好的功能是:

def product2(f: Int => Int): Int => Int => Int = { 
    a: Int => { 
    b: Int => { 
     if(a > b) 1 
     else f(a) * product2(f)(a+1)(b) 
    } 
    } 
} 

为了完整起见,你可以通过一个完整的参数列表之后使用下划线治疗有多个参数列表作为咖喱函数的函数。在你最初的例子中,你会做product1(f)_,它会返回一个(Int, Int) => Int类型的函数。

在研究这个问题时,我发现another SO question值得检查以更好地理解该语言的这一方面。