2011-10-09 23 views
9

以下兩個函數的類型有什麼區別?Scala中類似咖喱類型的區別

def add1: Int => Int => Int = a => b => a + b 
def add2(a: Int)(b: Int) = a + b 

根據他們的聲明,他們似乎有相同的類型。兩者都稱爲以相同的方式:

scala> add1(1)(2) 
res2: Int = 3 

scala> add2(1)(2) 
res3: Int = 3 

然而,在它們的類型的表觀差異:

scala> :t add1 
Int => Int => Int 

scala> :t add2 
(a: Int)(b: Int)Int 

此外,的add1局部應用大於add2吸塵器的位。

scala> add1(1) 
res4: Int => Int = <function1> 

scala> add2(1)(_) 
res5: Int => Int = <function1> 

回答

1

這兩個定義之間肯定有區別。考慮傳遞每個單一的參數。

add1(1) 
(Int) => Int = <function1> 

add2(1) 
<console>:9: error: missing arguments for method add2 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
     add2(1) 

但是,如果您部分應用了add2,它將與add1具有相同的類型。

scala> :t add1 
(Int) => (Int) => Int 

scala> :t add2 _ 
(Int) => (Int) => Int 

我完全理解add1。這是一個匿名函數,它接受一個I​​nt並返回並且Int => Int。這是咖喱函數的經典定義。

在我理解add2之前,我需要做更多的閱讀。據我所知,這是一種編寫函數的方法,它們的參數形式不同(即add2(1)(2)),並且可以很容易地轉換爲咖喱函數(add2 _)。

希望這會有所幫助!我也期待更好地解釋一下add2

編輯:這是關於Scala的咖喱方法有很大的文檔:http://www.codecommit.com/blog/scala/function-currying-in-scala

1

x.add1是一個函數Int => Int => Int

x.add2是一種方法,它不是一個值,也不具有與add1相同的類型。要獲得等效於x.add1的對象,您必須使用x.add2 _