【发布时间】:2014-08-07 17:15:42
【问题描述】:
我正在尝试实现(简化)特征的一个实例
trait TC[F[_]] {
def apply[A](fa: F[A]): F[A]
}
使用 Scala 宏。因此,宏的签名是
def materialize[F[_]](c: Context)(
implicit fT: c.WeakTypeTag[F[_]]): c.Expr[TC[F]]
现在需要将类型构造函数F[_] 应用于类型参数A,原因有两个:
- 为特定的
F写上apply的签名(如Foo[A]) - 检查
Foo[A]类型的成员以指定有趣的apply正文
有没有什么方法可以创建方法类型参数A对应的类型,而不是appliedType中使用的类型?这对我来说似乎很困难,因为方法 apply 及其类型参数 A 也只是生成为树。
我尝试将WeakTypeTag[TC[F]] 作为宏调用的附加参数并通过
val paramT = wfg.tpe.member("apply": TermName).tpe.typeParams.head.tpe
但是在q"... def apply[$paramT] ..." 中使用paramT 确实会导致
java.lang.IllegalArgumentException: can't splice "A" as type parameter
所以这似乎也不是解决方案。
【问题讨论】:
-
你使用的是 scala 2.10 吗?
-
另外,说到
java.lang.IllegalArgumentException: can't splice "A" as type parameter,你能分享完整的代码吗? -
嘿尤金,我一直在使用 2.10,但据我所知,在 2.10 和 2.11.2 之间切换并没有任何区别。完整的(最终工作)代码现在lives here
-
你试过
appliedType吗?
标签: scala reflection macros type-constructor materialize