我尝试使用包含类型参数的单例类型。我正在尝试编写一个函数来接受该单例类型的Witness和它的嵌套类型的类型类。单独获取每个内容很容易(请参阅下面的f1()
和f2()
),但我无法让它同时运行:
import shapeless._
import shapeless.labelled.FieldType
import shapeless.syntax.singleton._
sealed trait TC[L]
object TC {
implicit def intTC = new TC[Int] {}
}
object Test {
def f1[VI <: Vector[Int]](value: FieldType[VI, String])(
implicit wt: Witness.Aux[VI]) = {}
def f2[L](value: FieldType[_ <: Vector[L], String])(
implicit wt: TC[L]) = {}
def f3[L, M <: Vector[L]](value: FieldType[M, String])(
implicit wt: TC[L], witness: Witness.Aux[M]) = {}
val v = Vector(1,2,3)
f1(v ->> "foo") // works
f2(v ->> "foo") // works
f3(v ->> "foo") // does not work
}
我正在
inferred type arguments [Nothing,Test.v.type] do not conform to method f3's type parameter bounds [L,M <: Vector[L]]
[error] f3(v ->> "foo")
有没有办法帮助编译器同时推断内部类型和单例类型?
答案 0 :(得分:2)
以下对我有用。我添加了一个隐式参数ev
,它提供了M
是Vector[L]
的子类并将它们绑定在一起的证据。这足以阻止编译器推断L
是Nothing
。
def f3[L, M <: Vector[_]](value: FieldType[M, String])(
implicit witness: Witness.Aux[M],
ev: M <:< Vector[L],
wt: TC[L]) = {}