有没有办法扩展Scala中存在类型量词的范围,使类型检查器确信两个变量具有相同的类型?

有没有办法扩展Scala中存在类型量词的范围,使类型检查器确信两个变量具有相同的类型?,scala,types,existential-type,quantifiers,Scala,Types,Existential Type,Quantifiers,考虑以下代码段: case class Foo[A](a:A) case class Bar[A](a:A) def f[B](foo:Foo[Seq[B]], bar:Bar[Seq[B]]) = foo.a ++ bar.a val s : Seq[T] forSome {type T} = Seq(1, 2, 3) f(Foo(s), Bar(s)) 最后一行未能进行类型检查,因为Foo(s)对于某些{type T}具有类型Foo[Seq[T]],对于某些{type T}具有类型B

考虑以下代码段:

case class Foo[A](a:A)
case class Bar[A](a:A)

def f[B](foo:Foo[Seq[B]], bar:Bar[Seq[B]]) = foo.a ++ bar.a

val s : Seq[T] forSome {type T} = Seq(1, 2, 3)

f(Foo(s), Bar(s))
最后一行未能进行类型检查,因为
Foo(s)
对于某些{type T}具有类型
Foo[Seq[T]],对于某些{type T}
具有类型
Bar[Seq[T]],即每个都有自己的存在量词

这有什么办法吗?实际上,我在编译时所知道的
s
就是它有这样一种存在类型。我如何才能强制
Foo(s)
Bar(s)
属于一个存在量词的范围

这有意义吗?一般来说,我对Scala和花哨的类型是相当陌生的。

说清楚点

val s : Seq[T] forSome {type T} = Seq(1, 2, 3)
相当于

val s: Seq[_] = Seq(1, 2, 3)
我认为这个问题的答案是否定的。您需要使用范围内的类型参数/类型成员或具体类型

一种方法是使用标记的类型:


我意识到通过一点重构就可以实现这一点:

case class Foo[A](a:A)
case class Bar[A](a:A)

def f[B](foo:Foo[Seq[B]], bar:Bar[Seq[B]]) = foo.a ++ bar.a
def g[B](s1:Seq[B], s2:Seq[B]) = f(Foo(s1), Bar(s2))

val s : Seq[T] forSome {type T} = Seq(1, 2, 3)

g(s)
本质上,我将对
f
的调用封装在另一个函数
g
中,该函数保证两个序列具有相同的类型

case class Foo[A](a:A)
case class Bar[A](a:A)

def f[B](foo:Foo[Seq[B]], bar:Bar[Seq[B]]) = foo.a ++ bar.a
def g[B](s1:Seq[B], s2:Seq[B]) = f(Foo(s1), Bar(s2))

val s : Seq[T] forSome {type T} = Seq(1, 2, 3)

g(s)