在Scala中调用curry函数?

use*_*753 3 functional-programming scala function currying higher-order-functions

所以我对Scala中的curry函数如何工作有点困惑.我有以下代码编译,但我不确定如何!

def fixedPoint(f: Double => Double, initialGuess: Double) = {
   //dummy impl, does nothing.
}

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2

def sqrt(x: Int) = {
  fixedPoint(averageDamp(y => x/y))(1)
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译得很好,但我想averageDamp还需要另外一个参数吗?所以它应该是:

fixedPoint(averageDamp(y=> x/y)(1))(1)
Run Code Online (Sandbox Code Playgroud)

但这不编译,我得到一个消息说类型不匹配; 发现:双重要求:双⇒双

以下不编译,这是有道理的:

val num = averageDamp(y => x/y)
Run Code Online (Sandbox Code Playgroud)

这给出了编译错误消息:"对象Foo中方法averageDamp的缺少参数列表未应用的方法仅在期望函数类型时转换为函数."

因此我不确定为什么在调用一个参数调用averageDamp时会调用fixedPoint,但是当我自己调用它时无法编译.

任何帮助都会很棒.

Łuk*_*asz 6

这是编译的代码

def fixedPoint(f: Double => Double, initialGuess: Double) = {
   //dummy impl, does nothing.
}

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2

def sqrt(x: Int) = {
  fixedPoint(averageDamp(y => x/y), 1)
}
Run Code Online (Sandbox Code Playgroud)

在这条线上

fixedPoint(averageDamp(y => x/y), 1)
Run Code Online (Sandbox Code Playgroud)

即使averageDamp需要一个更多的参数列表(还有一个参数),它是有效的不放.实际上,这就是为什么它首先被定义为curry的原因 - 所以你可以将它作为一个函数使用.

scala>     val num = averageDamp(y => 5/y)(1)
num: Double = 3.0
Run Code Online (Sandbox Code Playgroud)

会给你一个Double你可能期望的类型的结果.

如果未传递第二个参数列表,则可以接收函数

val fun = averageDamp(y => 5/y)
Run Code Online (Sandbox Code Playgroud)

给你一个错误试图告诉你,你需要通知编译器你想fun成为一个函数.您可以通过以下方式执行此操作:

scala>     val fun: Double => Double = averageDamp(y => 5/y)
fun: Double => Double = <function1>
scala>     val fun = averageDamp(y => 5/y) _
fun: Double => Double = <function1>
Run Code Online (Sandbox Code Playgroud)

现在看看 fixedPoint

def fixedPoint(f: Double => Double, initialGuess: Double)
Run Code Online (Sandbox Code Playgroud)

它期望一个函数,Double => Double所以我们可以传递它

fixedPoint(averageDamp(y => 5/y), 1)
Run Code Online (Sandbox Code Playgroud)

编译器知道第一个参数应该是一个函数,并用这些知识是这种方法转换为尚未采取一个函数x: Double的参数和返回(x + f(x))/2