是否可以在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.它的工作原理,但我不希望有写Seq在Rect2D(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)
但我想使用重复的参数,不想参数化Y上B.
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |