1

我想制作一种可以用来验证元组是否同质的类型。我写了这个,它应该确保所有元素T都等于XScastie):

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]总是需要一个参数。这是一个错误还是我做错了什么,是否有修复/解决方法?

4

1 回答 1

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

https://github.com/scala/bug/issues/4719

于 2020-10-16T18:11:25.053 回答