在下面,我有一个类CurryDefaultDemo
,在构造函数中有一个参数,参数有一个默认值,它是一个curried函数。
scala> object Demo {
|
| type myF = String => Int
|
| def f(x: Int = 1)(y: String) = x + y.toInt
|
| }
defined module Demo
scala> import Demo._
import Demo._
scala> class CurryDefaultDemo(fun: myF = f())
defined class CurryDefaultDemo
如果默认值f()
被f
替换,我会收到以下错误:
scala> class CurryDefaultDemo(fun: myF = f)
<console>:11: error: type mismatch;
found : String => Int
required: Int
class CurryDefaultDemo(fun: myF = f)
^
我知道f
将是部分功能String => Int
。
&#34;要求在哪里:Int&#34;来自?
答案 0 :(得分:2)
f
既不是PartialFunction
,也不是部分应用的函数,甚至根本不是函数。 f
是一种方法。 f
有两个参数列表,需要调用Int
和String
。如果您将f
转换为函数(&#34; eta-expand&#34;),即f _
,您将获得Int => String => Int
类型的curried函数。
现在,f()
是什么?由于只有一个括号列表,因此只应用第一个参数列表,并且由于未提供任何参数,因此使用默认值,因此f()
等同于f(1)
。在CurryDefaultDemo
的定义中,Scala知道此表达式必须是myF
,即String => Int
,因此它会创建一个与x => f(1)(x)
等效的函数。
为什么f
无效?好吧,Scala看到你想要一个myF
,这是一种函数,所以它试图eta-expand f
,得到一个Int => String => Int
,这是一个返回类型为{{{1}的函数。 1}},它与String => Int
必须具有的Int
的返回类型不匹配。