将类型变量绑定到元素类型的集合

时间:2017-11-28 22:02:40

标签: scala higher-kinded-types

如何将多态类型变量绑定到Scala中的一元类型构造函数的参数?

def f[CollectionOfE] = new Blah[...]
{
  def g(a: E) = 
  { ... } 
}

...

val x = f[Set[Int]]  // want E above to bind to Int

g 的定义中,我希望能够引用已经实例化 f 的集合的参数类型。

我试过了:

def f[C[E]] = new Blah[...] ...

但是E的范围似乎是[ ... ]的本地范围,如果这有任何意义......

2 个答案:

答案 0 :(得分:1)

如果您将E定义为单独的参数,则可以执行此操作。 E.g。

def f[E, C <: util.Collection[E]] = new Blah  {
   def g(a: E) = ...
}

val x = f[Int, Set[Int]].g(1)  // compiles

val y = f[Int, Set[Int]].g("string")  // doesn't compile

修改 您可以通过使用下划线调用函数来使其更简洁:

f[Int, Set[_]].g(1)

答案 1 :(得分:0)

如果我理解你的意图,你可能需要这样的东西:

def f[E, C[_]] = new Blah[...] {
  def g(e: E) = ???
}

...

f[Int, Set]

基本上,如果您想稍后引用某个类型,则需要将其作为单独的类型参数。您可能还希望将C[_]的类型限制为某个集合。