让我通过一个例子来介绍这个问题。这是从马丁·奥德斯基的函数式编程课程的讲义2.3中获得的。具有多个参数列表的函数可以(有时)使用少于所需数量的参数的机制是什么?
我有一个功能,找到固定点反复,像这样
object fixed_points {
println("Welcome to Fixed Points")
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double) =
abs((x-y)/x) < tolerance
def fixedPoint(f: Double => Double)(firstGuess: Double) = {
def iterate(guess: Double): Double = {
println(guess)
val next = f(guess)
if (isCloseEnough(guess, next)) next
else iterate(next)
}
iterate(firstGuess)
}
我可以将此功能适应找到平方根像这样
def sqrt(x: Double) =
fixedPoint(y => x/y)(1.0)
然而,这不收敛的某些参数(比如4个)。所以我对它应用平均阻尼,基本上将它转换成牛顿 - 拉夫森像
def sqrt(x: Double) =
fixedPoint(y => (x/y+y)/2)(1.0)
它收敛。
现在平均阻尼一般足以保证其自身的功能,所以我修改我的代码,像这样
def averageDamp(f: Double => Double)(x: Double) = (x+f(x))/2
和
def sqrtDamp(x: Double) =
fixedPoint(averageDamp(y=>x/y))(1.0) (*)
哇!刚刚发生了什么??我使用averageDamp
只有一个参数(当它用两个定义时)并且编译器不会抱怨!现在
,我明白,我可以使用部分应用程序,像这样
def a = averageDamp(x=>2*x)_
a(3) // returns 4.5
有没有问题。但是,当我尝试使用averageDamp
小于参数的必要数量(如在sqrtDamp
完成),像这样
def a = averageDamp(x=>2*x) (**)
我得到一个错误missing arguments for method averageDamp
。
问题:
- 如何是我在做了(**)从(*)编译器抱怨前者而不是后者不同?
- 因此,在某些情况下,允许使用少于必需的参数。这些情况是什么,这个机制的名称是什么? (我意识到这将在'咖喱'的主题下,但我是在这个柯里子集的具体名称,因为它)
'fixedPoint'接受一个函数,所以它愿意扩展你的arg。另一种用法没有预期的类型,所以它不会。这是一个常见问题。 –