解决方案:
在参数定义中显式使用空类型。
def withImplicitsM(exprs: List[c.Tree], expr: c.Tree): c.Tree =
exprs match {
case Nil =>
expr
case head :: tail =>
val emptyType = tq""
val v = q"implicit val ${TermName(c.freshName())}: $emptyType"
q"""$head.flatMap($v => ${withImplicitsM(tail, expr)})"""
}
我怎么知道的
:
我破坏了一个类似的
flatMap
调用并查看参数定义的样子:
val flatmapExpression = q"cats.effect.IO.apply(1).flatMap(implicit i => cats.effect.IO.apply(2))"
val q"$foo($args)" = flatmapExpression
val q"(..$params) => $body" = args
val q"$mods val $name: $tpt = $rhs" = params(0)
println(mods)
println(name)
println(tpt)
println(rhs)
以下是打印出来的内容:
Modifiers(implicit <param>, , Map())
i
<type ?>
<empty>
注意
<type ?>
这是一个空类型。