在Scala中部分应用curried构造函数

时间:2014-06-26 09:32:15

标签: scala currying

请考虑以下事项:

class A(foo: Int)(bar: Int)(baz: Int)
object A{
    def apply(foo: Int)(bar: Int)(baz: Int) = new A(foo)(bar)(baz)
}

使用apply方法,我可以执行以下操作:

scala> A(1)(2)(3)
res12: Script.A = Script$A@7a6229e9

scala> A(1)_
res13: Int => (Int => Script.A) = <function1>

为什么我不能做以下事情:

scala> new A(1)_
<console>:21: error: missing arguments for constructor A in class A
              new A(1)_
              ^

我错过了语法明智吗?我认为构造函数只是类中的方法,所以它们应该在需要时被提升到函数(就像上面的apply方法一样)

1 个答案:

答案 0 :(得分:2)

在应该创建该类实例的类上调用new(在你的情况下为A),但是你要对new A(1) _做的是使A类的实例不完整承包商的数据,根本不符合逻辑。但是编写A(1) _是正确且合乎逻辑的原因在这种情况下,您将方法提升为函数(来自伴随对象的apply方法),该方法已经拥有构成该类实例的所有数据。