Конструктор класса Curried case на компаньоне

При определении класса case объект-компаньон по умолчанию имеет хороший метод curried для получения карри-версии конструктора класса case:

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

scala> Foo.curried
res4: String => (Int => Foo) = <function1>

Однако, как только я определяю явный объект-компаньон, этот метод исчезает:

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> :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>

Однако я хотел бы знать, почему он исчезает при определении явного компаньона (например, в отличие от apply)?

(Scala 2.9.2)

Ответ 1

Scalac создает спутник по умолчанию для каждого case class. Сопутствующий компаньон по умолчанию реализует scala.Function n.

Когда вы определяете явный собеседник, Scalac объединит явный компаньон по умолчанию.

Если вы хотите вызвать curried, вы должны позволить вашему явному компаньону реализовать Function2. Попробуйте:

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