2012-09-29 123 views
0

可能重複:
What's the rationale behind curried functions in Scala?斯卡拉:兩種方法之間的差異聲明函數

我有兩個區別的方式來聲明函數:1)使用鑽營。 2)使用功能作爲參數。

這裏是我的代碼:

def transform(f: Double => Double)(input: Double) = { 
    f(input) 
}             

def transformVer2(f: Double => Double, input: Double) = { 
    f(input) 
}             

transform(x=>x*x)(10)        //> res8: Double = 100.0 
transformVer2(x=>x*x, 10)       //> res9: Double = 100.0 

我不知道是什麼的上面兩個函數的聲明,真正的差別。請告訴我。

謝謝:)

+0

不,我不這麼認爲。在我的問題中,參數是一個函數:) – hqt

+0

它沒有任何區別,它仍然是一個問題。 –

回答

0

前者採用鑽營,後者則是一些你可能更熟悉的如C,C++等語言

柯里的東西是突出的函數式編程語言..函數式編程語言放在高一點的功能和功能鏈接的想法所以像

def transform(f: Double => Double)(input: Double) 

可以看作是一些需要作爲一個參數的函數Double => Double並返回另一個函數,該函數將一個參數作爲一個參數Double並返回Double

如Scala編程討論,函數柯里也讓我們做一些漂亮的東西,其中兩個腦海中出現

  1. 類型推斷
  2. 新的控制抽象

對於類型推斷,考慮像foldLeft

val myVector = Vector(1, 2, 3, 4) 
myVector.foldLeft(0.0)(_ + _) 

foldLeft是令行禁止,和我們指定0.0作爲初始值,讓我們的類型inferencer知道我們希望最終的結果是一個Double

對於新的控制抽象,我們可以做這樣的事情

def doWithFileAndClose(file: File)(func:() => Unit): Unit = 
    try { func() } finally { file.close } 

這將用於像

doWithFileAndClose("somefile.txt") { 
    /* do stuff */ 
} 

這利用的是斯卡拉將在地方括號接受花括號,這使得上面看起來就像熟悉的控制結構,如forwhile循環。

+0

從函數轉換的聲明我們不知道它返回Double。 –