带有函数参数的Scala

带有函数参数的Scala,scala,Scala,我正在用scala学习咖喱语,并尝试将我的知识应用到下面的代码中 object excercise { def sqrt2(input : Double) : ((Double, Double) => Double, Double) => Double = { def iter(guessFxn : (Double, Double) => Double, initial : Double) : Double = { if (isGoodEnough(i

我正在用scala学习咖喱语,并尝试将我的知识应用到下面的代码中

object excercise {

  def sqrt2(input : Double) : ((Double, Double) => Double, Double) => Double = {
    def iter(guessFxn : (Double, Double) => Double, initial : Double) : Double = {
      if (isGoodEnough(initial)) initial
      else {
        val newGuess: Double = guessFxn(initial, input)
        iter(guessFxn, newGuess)
      }
    }

    iter

    def isGoodEnough(guess: Double): Boolean = {
      math.abs(guess * guess - input ) / input < 0.001
    }

  }
  println(sqrt2(2) ( (g: Double, c: Double) => (g + c / g) / 2, 1))

}

你只需要颠倒这些代码的顺序:

iter

def isGoodEnough(guess: Double): Boolean = {
   math.abs(guess * guess - input ) / input < 0.001
}
因为如前所述,
iter
方法不会返回(因为它的调用不是在方法的末尾进行的),因此编译器希望执行它。
当然,要执行它,它需要您没有提供的强制参数。
因此,编译器“认为”您希望部分应用该函数,但效果很差。注部分应用的功能与部分功能的概念不同,其含义不同
它将允许延迟调用,并且主要用于处理标准函数(不是curried),我们可能只需要提供第一个参数,然后提供以下参数

部分应用功能的示例:

def sum(i: Int, j: Int){...}
电话:

sum 1 _ //just the second parameter needs to be applied later.
sum _  //none parameter is specified, would need to specify both later.
sum 1 2 //complete call, not partially applied so
您可以找到部分应用函数的良好用例

follow this method with `_' if you want to treat it as a partially applied function
    iter
def sum(i: Int, j: Int){...}
sum 1 _ //just the second parameter needs to be applied later.
sum _  //none parameter is specified, would need to specify both later.
sum 1 2 //complete call, not partially applied so