如何在更高级的类型上正确地模式匹配TypeRepr
?存在成功匹配类,但当我尝试使用类型时,我得到编译器错误unreducible application of higher-kinded type writetype.Foo to wildcard arguments
import scala.quoted.*
type Foo[X]
class Bar[X]
inline def writeType[T]: String = ${writeTypeImpl[T]}
def writeTypeImpl[T](using Type[T], Quotes): Expr[String] =
import quotes.reflect.*
val tpe = TypeRepr.of[T]
val s = tpe.asType match
//case '[Foo[?]] => "FooSuccess"
case '[Bar[?]] => "BarSuccess"
case _ => "Fail"
Expr(s)
2条答案
按热度按时间ubby3x7f1#
这就是你需要的答案:
https://docs.scala-lang.org/scala3/guides/migration/incompat-other-changes.html#wildcard-type-argument
必须使用
trait
或abstract class
或Foo[A]
,其中是具体类型(或类型参数)gg58donl2#
@smarter:
这是故意不支持的:我们只允许类类型上的通配符(因为其他任何东西都等同于我们不支持的存在类型)
https://github.com/lampepfl/dotty/issues/9897
https://github.com/lampepfl/dotty/issues/5302
https://users.scala-lang.org/t/solved-unreducible-application-of-higher-kinded-type-to-wildcard-arguments/7257
https://docs.scala-lang.org/scala3/reference/dropped-features/existential-types.html
可以匹配
'[Foo[t]]
但这并不能像预期的那样处理抽象类型