Scala - 两个函数共享第二个参数列表

Scala - Two functions sharing the second parameter list

我是 Scala 的新手,我刚遇到一种情况,希望有人能解释一下。

在观看 Martin Odersky 的课程时,我发现他使用以下脚本来解释函数,其中 return 一个函数

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) 

我完全理解凭据的工作原理,但我没想到这一行:

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

我知道多亏了 Currying,Scala 让我们可以编写带有多个参数列表的函数。因此,调用 fixedPoint 作为参数传递 avergaDamp 和 (1) 的结果对我来说很清楚。

我不明白的是 averageDamp 如何在 fixedPoint 的第二个参数列表本身位于第一个参数列表中时使用它.我虽然那将是一个不同的范围,所以我期待这样的事情:

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

Scala 的 属性 允许我们以这种方式实现柯里化的是什么?是否类似于隐式应用于参数列表?

感谢您的宝贵时间

这就是多参数列表的工作原理:averageDamp(y => x/y) 等同于 z => averageDamp(y => x/y)(z),因此它的类型是 Double => Double

如果您按预期编写 fixedPoint(averageDamp(y => x/y)(1))(1),它会出现类型不匹配,因为 averageDamp(y => x/y)(1) 的类型为 Double,而 fixedPoint 需要 Double => Double

隐式在这里不相关。

此行有效,因为在以下表达式中:

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

函数 "averageDamp(y => x/y)" 是 "passed by name" 即它在传递给函数 "fixedPoint" 时不会被求值,但是当它从 "fixedPoint" 内部调用时会被求值。

value "(1)" 只是传递给 "fixedPoint" 的参数 "firstGuess",它将提供给以下表达式中函数定义内的参数 "guess":

val next = f(guess)