Почему классы дел расширяют только Product, а не Product1, Product2, ..., ProductN? - PullRequest
13 голосов
/ 07 сентября 2011

После того, как я узнал, что тематические классы расширяют Product, я удивился, почему они не расширяют ProductN. Например, с кодом вроде:

case class Foo(a: Int)

Я бы ожидал, что Foo(1).asInstanceOf[Product1[Int]] будет работать, но это не работает (проверено в Scala 2.9.1, подтверждено другими источниками и Product документацией).

Меня это заинтересовало, потому что я хотел объявить такие классы, как:

abstract class UnaryOp[T1 <: Exp[_], R](t1: T1) extends Exp[R] {
  this: Product1[T1] =>
}

Таким образом, узел для унарной операции должен быть реализован Product1. Было бы хорошо, если бы для этого было достаточно простого класса case с одним параметром.

Ответы [ 3 ]

11 голосов
/ 08 сентября 2011

Примите во внимание следующее:

case class X(n: Int)
case class Y(x: String, y: Int) extends X(y)

Если классы расширений расширены ProductN, то это расширит и Product1, и Product2, но параметр типа изменится, поэтому для * существуют две различные перегрузки1007 *.Это только одна проблема - держу пари, что есть и другие.

Теперь наследующий класс case-класса устарел, и Мартин Одерски сейчас рассматривает вопрос о том, чтобы заставить их наследовать ProductN.AFAIK, это еще не сделано, но препятствие было устранено.

3 голосов
/ 09 сентября 2011

Я вернул его вскоре после того, как Мартин сказал, что мы можем это сделать. Он пока не работает правильно, но в той степени, в которой он работает, он отстает от -Xexperimental в сборках транка.

scala> case class Foo[T, U](x1: T, x2: U)
defined class Foo

scala> Foo(List("a"), "b")
res0: Foo[List[java.lang.String],java.lang.String] = Foo(List(a),b)

scala> res0.isInstanceOf[Product2[_,_]]
res1: Boolean = true
0 голосов
/ 07 сентября 2011

Если Product1[Int] будет автоматически продлен, val _1: Int также должен быть предоставлен. Хотя я мог представить, что это может быть автоматизировано, что a будет присвоено _1 и т. Д. И т. Д., Но это не так. Возможно, чтобы не усложнять ситуацию.

...