我是scala的新手,正在進行scala功能開發課程。下面的代碼片段解釋了有關討好斯卡拉咖喱例
import math.abs
object exercise{
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)
}
def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2
def sqrt(x: Double) = fixedPoint(averageDamp(y => x/y))(1)
}
我無法理解的代碼的以下部分
fixedPoint(averageDamp(y => x/y))(1)
我知道averageDamp功能需要兩個參數(一個是功能和其他是x的值),但是當它從fixedPoint調用時,我們不會傳遞x的值。所以我認爲它創建了一個部分函數,它被髮回sqrt,其中x的值是從sqrt(x:Double)中傳遞的。所以,我提出以下函數編譯失敗
def noIdea(x: Double) = averageDamp(y => x/y)
有人可以解釋這樣對我?
感謝您的回覆。它與下劃線一起工作,但是如果你注意到我沒有把下劃線作爲 > def sqrt(x:Double)= fixedPoint(averageDamp(y => x/y))(1) 它仍然有效,是什麼樣的魔法這是??? –
因爲在那種情況下它期待着一個函數,如果你給'noIdea'一個'Double => Double'的類型,情況也是如此。當Scala知道該值應該是一個函數('A => B')時,它會自動觸發所謂的eta擴展,閱讀更多[here](http://blog.jaceklaskowski.pl/2013/11 /23/how-much-one-ought-to-know-eta-expansion.html)。提供下劃線會自動觸發。 –
@RockwellSydney看到我更新的答案 –