存在类型和重复参数

Tra*_*own 6 types scala

是否可以在Scala中具有重复参数类型的存在类型范围?

动机

这个答案中,我使用以下案例类:

case class Rect2D[A, N <: Nat](rows: Sized[Seq[A], N]*)
Run Code Online (Sandbox Code Playgroud)

它做我想要的,但我不关心N(除了需要知道它对所有行都是一样的),并且不希望它在Rect2D类型参数列表中.

我试过的东西

以下版本给出了错误的语义:

case class Rect2D[A](rows: Sized[Seq[A], _ <: Nat]*)
Run Code Online (Sandbox Code Playgroud)

存在主义是在*,所以我不能保证所有行都具有相同的第二类型参数 - 例如,以下编译,但不应该:

Rect2D(Sized(1, 2, 3), Sized(1, 2))
Run Code Online (Sandbox Code Playgroud)

以下版本具有我想要的语义:

case class Rect2D[A](rows: Seq[Sized[Seq[A], N]] forSome { type N <: Nat })
Run Code Online (Sandbox Code Playgroud)

我在这里forSome用来解除外在的存在主义Seq.它的工作原理,但我不希望有写SeqRect2D(Seq(Sized(1, 2, 3), Sized(3, 4, 5))).

我试过做类似的事情*:

case class Rect2D[A](rows: Sized[Seq[A], N] forSome { type N <: Nat }*)
Run Code Online (Sandbox Code Playgroud)

和:

case class Rect2D[A](rows: Sized[Seq[A], N]* forSome { type N <: Nat })
Run Code Online (Sandbox Code Playgroud)

第一个(毫不奇怪)与_版本相同,第二个不编译.

简化示例

考虑以下:

case class X[A](a: A)
case class Y(xs: X[_]*)
Run Code Online (Sandbox Code Playgroud)

我不想Y(X(1), X("1"))编译.确实如此.我知道我可以写:

case class Y(xs: Seq[X[B]] forSome { type B })
Run Code Online (Sandbox Code Playgroud)

要么:

case class Y[B](xs: X[B]*)
Run Code Online (Sandbox Code Playgroud)

但我想使用重复的参数,不想参数化YB.

ven*_*hka -1

以简化的示例为例:您可以在 Y 上声明一个附加类型参数:

案例类别 Y[V](xs: X[V]*)

该类型参数应该是可推断的,因此从用户角度无需编写任何额外内容。