2017-07-16 32 views
1

我是斯卡拉新手,我剛剛遇到了一個我希望有人能解釋我的情況。斯卡拉 - 共享第二個參數列表的兩個函數

在觀看馬丁·奧德斯基的過程中,我發現下面的腳本,他用來解釋它返回一個函數

val tolerance = 0.0001 

def isCloseEnough(x : Double, y : Double) = abs((x - y)/ x)/x < tolerance 

def fixedPoint(f : Double => Double)(firstGuess: Double) = { 
    def iterate(guess: Double): Double = { 
     val next = f(guess) 
     if(isCloseEnough(guess,next))next 
     else iterate(next) 
    } 
     iterate(firstGuess) 
    }            

fixedPoint(x => 1 + x/2)(1)  

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2 

def sqrt(x : Double) = fixedPoint(averageDamp(y => x/y))(1) 


sqrt(2) 

我完全理解如何紙條作品的功能,但我沒想到這行:

定點(averageDamp(Y => X/Y))(1)

我知道,多虧柯里,斯卡拉讓我們寫幾個參數列表功能。所以對fixedPoint的呼叫作爲參數傳遞給avergaDamp的結果,並且(1)對我很明顯。

我不明白的是averageDamp如何使用的第二個參數列表定點時,它本身就是第一個參數列表中。我雖然這將是一個不同的範圍,因此我期待類似:

定點(averageDamp(Y => X/Y)(1))(1)

什麼是Scala中的屬性這使我們能夠以這種方式實現咖喱?是類似於隱式應用於參數列表?

感謝您的時間

回答

2

這是多參數列表是如何工作的:averageDamp(y => x/y)相當於z => averageDamp(y => x/y)(z)所以它的類型是Double => Double

如果你寫了fixedPoint(averageDamp(y => x/y)(1))(1)如您所願,那麼它將有一個類型不匹配,因爲averageDamp(y => x/y)(1)的類型是DoublefixedPoint需求Double => Double

含義在這裏不相關。

+0

感謝您的反饋 –

2

此行工作,因爲在下面的表達式:

fixedPoint(averageDamp(y => x/y))(1) 

函數「averageDamp(Y => X/Y)」是「以名稱傳遞」,即它不會被評估,同時使起作用「定點「但會在從」fixedPoint「內部調用它時進行評估。

值「(1)」只是傳遞給變量「定點」的「firstGuess」,其將被提供在下面的表達式給參數「猜測」函數定義內:

val next = f(guess) 
+0

感謝您的反饋 –