我想创建一个可以用来验证元组是否同质的类型。我写了这个,应该确保T
的所有元素都等于X
(Scastie):
type Homogenous[X] = [T <: Tuple] =>> T match {
case EmptyTuple => DummyImplicit
case X *: t => Homogenous[X][t] //Doesn't work
case _ => Nothing
}
def f[T <: Tuple : Homogenous[String]](t: T) = ???
无论出于何种原因,第三行都不会编译,并显示以下错误:
均质[X]不使用类型参数
但是,如果我使Homogenous
接受2个参数,它将编译,但我不能再使用上下文绑定(Scastie)。
type Homogenous[X, T <: Tuple] = T match {
case EmptyTuple => DummyImplicit
case X *: t => Homogenous[X, t]
case _ => Nothing
}
我不明白为什么会这样。似乎lambda [T] =>>
只是从匹配类型的特定情况下返回而已,因此编译器应意识到Homogenous[X]
始终采用参数。这是错误还是我做错了什么?是否有修复程序/解决方法?
答案 0 :(得分:2)
看起来像是错误或未充分使用的功能。
作为解决方法,请尝试
trait Hom[X] {
type Rec[T <: Tuple] = T match {
case EmptyTuple => DummyImplicit
case X *: t => Rec[t]
case _ => Nothing
}
}
type Homogenous[X] = [T <: Tuple] =>> Hom[X]#Rec[T]
也许与
有关https://contributors.scala-lang.org/t/multiple-type-parameter-lists-in-dotty-si-4719