【问题标题】:Default parameter in curried function咖喱函数中的默认参数
【发布时间】:2014-06-26 06:12:52
【问题描述】:

在下面,我有一个类CurryDefaultDemo,在构造函数中有一个参数,该参数有一个默认值,它是一个柯里化函数。

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 =&gt; Int。 “必需:Int”从何而来?

【问题讨论】:

    标签: scala


    【解决方案1】:

    f 既不是PartialFunction,也不是部分应用的函数,甚至根本不是函数。 f 是一种方法。 f 有两个参数列表,需要同时调用 IntString。如果将f 转换为函数(“eta-expand”),即f _,则会得到Int =&gt; String =&gt; Int 类型的柯里化函数。

    现在,f() 是什么?因为只有一个括号列表,所以只应用第一个参数列表,并且由于没有提供参数,它使用默认值,所以f() 等价于f(1)。在CurryDefaultDemo的定义中,Scala知道这个表达式必须是myF,即String =&gt; Int,所以它创建了一个等价于x =&gt; f(1)(x)的函数。

    为什么普通的f 不起作用?好吧,Scala 看到你想要一个 myF,它是一种函数,所以它尝试对 f 进行 eta 扩展,得到一个 Int =&gt; String =&gt; Int,它是一个返回类型为 String =&gt; Int 的函数,它没有匹配 myF 必须具有的 Int 的返回类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多