【发布时间】:2015-01-01 11:04:34
【问题描述】:
请在下面找到有关 Scala 函数式编程的 Coursera 在线课程(第 2.3 课)的一段代码。
package week2
import math.abs
object lecture2_3_next {
def fixedPoint(f: Double => Double)(firstGuess: Double): Double = {
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double): Boolean = abs((x - y) / x) / x < tolerance
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): Double = (x + f(x)) / 2
def sqrt(x: Double): Double = fixedPoint(averageDamp(y => x / y))(1)
sqrt(2)
}
在我试图理解这段代码时,有几点阻碍了我。
我希望您能帮助我理解这段代码。
让我烦恼的两点是:
- 当您调用 averageDamp 时,传递的函数中有 2 个参数“x”和“y”(例如averageDamp(y => x / y))但您从未在 averageDamp 函数的定义中指定“y”参数(例如def averageDamp(f: Double => Double)(x: Double): Double = (x + f(x)) / 2 )。 scala 编译器在哪里以及如何评估“y”参数。
- 第二点可能和第一点有关,其实我也不知道。当我调用averageDamp 函数时,我只传递函数'f' 参数(例如y => x / y),但我不传递函数的第二个参数'x'(例如(x: Double) 第二个参数)。在这种情况下,scala 编译器如何评估“x”参数以呈现 averageDamp 调用的结果。
我想我错过了有关 scala 和函数式编程的评估或替换模型的一些内容。
感谢您的帮助,新年快乐!
埃尔韦
【问题讨论】:
标签: scala functional-programming evaluation