Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala宏的部分应用_Scala_Macros_Scala Macros_Type Parameter - Fatal编程技术网

Scala宏的部分应用

Scala宏的部分应用,scala,macros,scala-macros,type-parameter,Scala,Macros,Scala Macros,Type Parameter,举例说明问题: import scala.language.experimental.macros import scala.reflect.macros.blackbox object Test { def foo1[A, B]: Unit = macro impl[A, B] def foo2[A]: Unit = macro impl[A, Option[Int]] def impl[A: c.WeakTypeTag, B: c.WeakTypeTag](c: blackb

举例说明问题:

import scala.language.experimental.macros
import scala.reflect.macros.blackbox

object Test {
  def foo1[A, B]: Unit = macro impl[A, B]
  def foo2[A]: Unit = macro impl[A, Option[Int]]

  def impl[A: c.WeakTypeTag, B: c.WeakTypeTag](c: blackbox.Context): c.Expr[Unit] = {
    import c.universe._
    c.echo(c.enclosingPosition, s"A=${weakTypeOf[A]}, B=${weakTypeOf[B]}")
    reify(())
  }
}

/*
scala> Test.foo1[Int, Option[Int]]
<console>:12: A=Int, B=Option[Int]
       Test.foo1[Int, Option[Int]]
                ^
scala> Test.foo2[Int]
<console>:12: A=Int, B=Option[A] // <--- Expected: A=Int, B=Option[Int]
       Test.foo2[Int]
*/
但是这个问题的答案对我来说仍然很有趣。

键入Lambda

def foo2[A]: Unit = macro impl[A, {type A = Option[Int]}]

def impl[A: c.WeakTypeTag, B: c.WeakTypeTag](c: blackbox.Context): c.Expr[Unit] = {
  import c.universe._
  //Option[Int]
  println(c.weakTypeOf[B].members.find(_.isType).get.typeSignature)
  reify(())
}
def foo2[A]: Unit = macro impl[A, {type A = Option[Int]}]

def impl[A: c.WeakTypeTag, B: c.WeakTypeTag](c: blackbox.Context): c.Expr[Unit] = {
  import c.universe._
  //Option[Int]
  println(c.weakTypeOf[B].members.find(_.isType).get.typeSignature)
  reify(())
}