【发布时间】:2016-06-16 05:19:11
【问题描述】:
我正在学习 Scala Coursera 课程,而讲座似乎缺少对多个参数列表如何真正起作用的解释。
他声称可以仅使用第一个参数 (f) 调用下面的 averageDamp() 函数,允许您稍后使用第二个参数调用它。似乎您需要通过使用“_”来明确地进行部分绑定。
但是,如果将部分绑定调用传递给另一个函数,该函数接受具有与部分绑定函数匹配的签名的函数,它将隐式接受它,不需要“_”。
然而他根本没有使用术语部分绑定,只是说在 Scala 中有一种特殊的语法可以基本上返回一个闭包,而实际上它只是部分绑定。还是不行?
scala> def averageDamp(f: Double => Double)(x: Double) = (x+f(x))/2
scala> def fixedPoint(f: Double => Double)(x: Int) = f(x)+1
scala> fixedPoint(averageDamp(x=>x+1))(2)
res29: Double = 3.5
scala> averageDamp(x=>x+1)
<console>:19: error: missing arguments for method averageDamp;
follow this method with `_' if you want to treat it as a partially applied function
averageDamp(x=>x+1)
averageDamp 的非部分绑定版本可能类似于:
def averageDamp(f: Double => Double): (Double => Double) =
def inner(x: Double): Double =
(x+f(x))/2
inner
我想我的问题是...averageDamp() 的多参数列表版本是否被传递给另一个函数只是隐式部分绑定...或者这真的是某种特殊的 Scala 语法,用于返回内部函数/关闭?
【问题讨论】:
-
郑重声明,
scala -print可以回答很多此类问题(尽管您必须深入研究与 repl 相关的代码)。您可以看到,出于性能原因,def foo(a: Int)(b: Int): Int被编译为def foo(a: Int, b: Int): Int。
标签: scala