以下代码有效,但我不太明白参数如何映射到参数列表。请注意,我是 Scala 新手。
import Math.abs
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.0)
sqrt(2.0)
上面的sqrt
函数的主体是fixedPoint(averageDamp(y => x/y))(1.0)
哪里
(y => x/y)
映射到 averageDamp
函数的 (f: Double => Double)
和
(1.0)
映射到 fixedPoint
函数的 (firstGuess: Double)
,但是
看起来没有任何内容映射到 averageDamp
函数的 (x: Double)
。
提前谢谢您。
最佳答案
这称为currying 。真正发生的是,averageDamp(y => x/y)
被解释为一个函数:Double => Double
,因为一旦将第一个参数列表设置为特定的一组值,您将获得一个采用第二个参数列表的函数。
例如,考虑以下代码:
def multiply(x: Double)(y: Double) = x * y
val multiplyByFive: Double => Double = multiply(5)
println(multiplyByFive(2)) // 10
println(multiplyByFive(6)) // 30
如您所见,仅对两个参数列表中的一个应用 multiply
会创建第二个参数列表的新函数(此处 (y: Double)
),第一个参数列表具有一组固定值(此处为 (5)
)。
另一种等效的编写方法如下:
val multiplyByFive: Double => Double = multiply(5)(_)
这里我们显式应用带有两个参数列表的函数,但对第二个参数列表使用通配符,这是告诉编译器创建一个用函数参数替换下划线的函数的一种方式。
关于scala - 在 Scala 中递归计算平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42463794/