Scala 同伴上的curry case类构造函数

Scala 同伴上的curry case类构造函数,scala,currying,case-class,companion-object,Scala,Currying,Case Class,Companion Object,定义案例类时,默认伴随对象具有nicecurried方法来获取案例类构造函数的curried版本: scala> case class Foo(a: String, b: Int) defined class Foo scala> Foo.curried res4: String => (Int => Foo) = <function1> scala>case类Foo(a:String,b:Int) 定义类Foo scala>Foo.curried res

定义案例类时,默认伴随对象具有nice
curried
方法来获取案例类构造函数的curried版本:

scala> case class Foo(a: String, b: Int)
defined class Foo

scala> Foo.curried
res4: String => (Int => Foo) = <function1>
scala>case类Foo(a:String,b:Int)
定义类Foo
scala>Foo.curried
res4:String=>(Int=>Foo)=
但是,一旦我定义了一个显式的伴生对象,这个方法就会消失:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class Foo(a: String, b: Int)
object Foo {}

// Exiting paste mode, now interpreting.

defined class Foo
defined module Foo

scala> Foo.curried
<console>:9: error: value curried is not a member of object Foo
              Foo.curried
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
案例类Foo(a:String,b:Int)
对象Foo{}
//正在退出粘贴模式,现在正在解释。
定义类Foo
定义模块Foo
scala>Foo.curried
:9:错误:curried值不是对象Foo的成员
咖喱
我可以这样把它拿回来:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class Foo(a: String, b: Int)
object Foo { def curried = (Foo.apply _).curried }

// Exiting paste mode, now interpreting.

defined class Foo
defined module Foo

scala> Foo.curried
res5: String => (Int => Foo) = <function1>
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
案例类Foo(a:String,b:Int)
对象Foo{def curried=(Foo.apply_u2;).curried}
//正在退出粘贴模式,现在正在解释。
定义类Foo
定义模块Foo
scala>Foo.curried
res5:String=>(Int=>Foo)=
但是,我想知道为什么在定义显式同伴时它会消失(例如,与
apply
)相反


(Scala 2.9.2)

Scalac为每个
案例类创建一个默认的伴奏。默认附带实现
scala.Function
n

当您定义显式同伴时,Scalac会将显式同伴与默认同伴合并

如果要调用
curried
,必须让显式同伴实现
函数2
。尝试:

case class Foo(a: String, b: Int)
object Foo extends ((String, Int) => Foo) {
  def otherMethod = "foo"
}

也许合成伴侣扩展了Function2并从那里得到了咖喱?也许你也可以这样做。我不知道为什么它会丢失,但作为一种解决方法,
(Foo(,,))咖喱也有同样的效果。还有一个相关的问题——不完全是重复的,所以我不会用一个相当权威的公认答案来标记它。@MichałPolitowski确实,显式扩展Function2就可以了。@TravisBrown谢谢你的链接,错过了那个链接。