(簡略化された)特性のインスタンスを具体化しようとしています
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]]
次の 2 つの理由から、型コンストラクターF[_]
を型パラメーターに適用する必要があります。A
apply
上記の署名を特定のF
もの ( などFoo[A]
)に書き込むにはFoo[A]
興味深い本体を指定するために型のメンバーを検査するにはapply
A
で使用できるメソッド型パラメーターに対応する型を作成する方法はありますappliedType
か? apply
メソッドとその型パラメーターA
もツリーとして生成されているだけなので、私には難しいようです。
マクロ呼び出しへの追加引数として取得しようとしWeakTypeTag[TC[F]]
ましたが、パラメーターの型を受け取りました
val paramT = wfg.tpe.member("apply": TermName).tpe.typeParams.head.tpe
しかし、paramT
inを使用するとq"... def apply[$paramT] ..."
、
java.lang.IllegalArgumentException: can't splice "A" as type parameter
したがって、これも解決策ではないようです。