提取和使用更高级别的类型参数?

时间:2017-03-05 02:21:11

标签: scala higher-kinded-types

假设我有一个类型更高的类型,我尝试写这样的东西:

class Foo[T[U]](thing: T[U]) {
  def someMethodThatUsesU(arg: U): U = ???
}

编译失败,因为编译器无法识别符号U。怎么会?是否有另一种方法可以在不执行class Foo[U, T[U]]之类的情况下编写此内容?

某些背景信息:这是问题的简化示例。最终,我想写这样的东西:

trait SomeTrait[T]

class SomeClass[T[U] <: SomeTrait[U]](arg: T[U]) {
  def somethingWithU(arg: U): U = ???
}

2 个答案:

答案 0 :(得分:3)

如果你关心T[U]是什么,那么

U并不是一个更高级的类型。它&#39;只是一个普通的旧类型。如果您的类或方法仅通过某种类型的构造函数进行参数化,则可以使用更高级的类型,例如, OptionList

class[T[U]](...)无法编译,因为您尝试使用两个类型参数,但只声明T。无法以这种方式声明两个类型参数。您唯一的好选择是声明T为更高级别的,第二个类型参数U可以独立变化:

class Foo[T[_], U](thing: T[U]) {
  def someMethodThatUsesU(arg: U): U = ???
}

答案 1 :(得分:0)

我找到了一个适用于我的用例的解决方案。只需将该类型指定给类型成员并使用类型投影:

trait SomeTrait[T] {
  type A = T
}

class SomeClass[T <: SomeTrait[_]] {
  def someMethod(arg: T#A): T#A
}