Класс Case и Линеаризация трейтов

Предположим, что я хочу написать класс case Stepperследующим образом:

case class Stepper(step: Int) {def apply(x: Int) = x + step}

Он поставляется с хорошей реализацией toString:

scala> Stepper(42).toString
res0: String = Stepper(42)

, но на самом деле это не функция:

scala> Some(2) map Stepper(2)
<console>:10: error: type mismatch;
 found   : Stepper
 required: Int => ?
              Some(2) map Stepper(2)

Обходной путь заключается в реализации трейта Function...

case class Stepper(step: Int) extends (Int => Int) {def apply(x: Int) = x + step}

Но тогда я больше не могу получить бесплатную хорошую реализацию toString:

scala> Stepper(42).toString
res2: java.lang.String = <function1>

Тогда возникает вопрос: могу ли я иметь лучшее из этих двух миров? Есть ли решение, в котором у меня есть хорошая реализация toStringбесплатно Иреализация черты Function. Другими словами, есть ли способ применить линеаризацию таким образом, чтобы case classсинтаксический сахар применялся наконец?

10
задан Nicolas 14 March 2012 в 15:01
поделиться