【发布时间】:2012-07-18 11:49:54
【问题描述】:
Scala 中重复参数的类型是否有可能存在类型范围?
动机
在this answer我使用以下案例类:
case class Rect2D[A, N <: Nat](rows: Sized[Seq[A], N]*)
它做我想做的事,但我不关心N(除了需要知道它对于所有行都是一样的),并且不希望它出现在Rect2D的类型参数列表中.
我尝试过的东西
以下版本给了我错误的语义:
case class Rect2D[A](rows: Sized[Seq[A], _ <: Nat]*)
existential 在* 下,所以我不能保证所有行都具有相同的第二个类型参数——例如,以下编译,但不应该:
Rect2D(Sized(1, 2, 3), Sized(1, 2))
以下版本具有我想要的语义:
case class Rect2D[A](rows: Seq[Sized[Seq[A], N]] forSome { type N <: Nat })
在这里,我使用forSome 将存在主义提升到外部Seq 之上。它有效,但我不想在Rect2D(Seq(Sized(1, 2, 3), Sized(3, 4, 5))) 中写Seq。
我尝试用*做类似的事情:
case class Rect2D[A](rows: Sized[Seq[A], N] forSome { type N <: Nat }*)
还有:
case class Rect2D[A](rows: Sized[Seq[A], N]* forSome { type N <: Nat })
第一个(毫不奇怪)与_ 版本相同,而第二个无法编译。
简化示例
考虑以下几点:
case class X[A](a: A)
case class Y(xs: X[_]*)
我不希望 Y(X(1), X("1")) 编译。确实如此。我知道我可以写:
case class Y(xs: Seq[X[B]] forSome { type B })
或者:
case class Y[B](xs: X[B]*)
但我想使用重复的参数,不想在B 上参数化Y。
【问题讨论】:
-
在您的简化示例中,
case class Y[B](xs: X[B]*)不是一个有效的解决方案吗? -
@Nicolas:对不起,这个问题没有明确表明我试图避免这种解决方案(这正是我在链接答案中使用的方法)。我进行了编辑以使其更清晰。