curried函数中的默认参数

时间:2014-06-25 21:36:35

标签: scala

在下面,我有一个类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;来自?

1 个答案:

答案 0 :(得分:2)

f既不是PartialFunction,也不是部分应用的函数,甚至根本不是函数。 f是一种方法。 f有两个参数列表,需要调用IntString。如果您将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的返回类型不匹配。