类型类和匹配类型是Scala3中执行类型级计算的两种方法(如Scala2中的类型投影和类型类,Haskell中的类型族和类型类)。
混合类型类和匹配类型可能很棘手。
你似乎想要类型类而不是匹配类型
trait ValuesOf[T <: Tuple]:
def value: T
object ValuesOf:
given ValuesOf[EmptyTuple] with
val value = EmptyTuple
given [h, t <: Tuple](using vh: ValueOf[h], vt: ValuesOf[t]): ValuesOf[h *: t] with
val value = vh.value *: vt.value
def singleInhabitantsOf[T <: Tuple](using holder: ValuesOf[T]): T = holder.value
singleInhabitantsOf[(Color.red.type, Color.blue.type)] // (red,blue)
但这个解决方案对我的最终目的没有用处,因为单重性的检查应该在方法签名中,这样,如果出现问题,编译器就不会开始处理主体。
听起来有点奇怪。您可以始终从左侧到右侧“隐藏”隐式参数。在Scala 2中,您可以重写
def foo[A](implicit tc: TC[A]): Unit = ()
像
def foo[A]: Unit = macro fooImpl[A]
def fooImpl[A: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
import c.universe._
c.inferImplicitValue(weakTypeOf[TC[A]])
q"()"
}
在Scala 3中,您可以重写
def foo[A](using TC[A]): Unit = ()
像
inline def foo[A]: Unit =
summonInline[TC[A]]
()
也许你可以告诉更多关于你的实际问题(也许开始一个新问题),我们可以看看它是否可以通过匹配类型来解决,
summonAll
,
constValueTuple
和其他来自
scala.compiletime.*
.