使用Scala宏将类型构造函数应用于生成的类型参数

b工作室

我正在尝试实现(简化)特征的一个实例

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,出于以下两个原因,需要将类型构造函数应用于type参数

  1. apply特定内容F(如Foo[A]以上签名
  2. 检查类型的成员Foo[A]以指定一个有趣的主体apply

有没有什么方法来创建对应的方法类型参数的类型A是能够比使用appliedType对我来说似乎很困难,因为方法apply及其类型参数A也只是作为树生成。


我试图WeakTypeTag[TC[F]]作为宏调用的附加参数,并通过以下方式接收了参数类型

val paramT = wfg.tpe.member("apply": TermName).tpe.typeParams.head.tpe

但是使用paramTinq"... def apply[$paramT] ..."确实会导致

java.lang.IllegalArgumentException: can't splice "A" as type parameter

因此这似乎也无济于事。

b工作室

我通过将上述特征的定义更改为

trait TC[F[_]] {
  type ApplyF[A] = F[A]
  def apply[A](fa: ApplyF[A]): ApplyF[A]
}

然后对树进行类型检查以获取虚拟值

typecheck(q"""new TC[Foo] {
  def apply[A](fa: ApplyF[A]): ApplyF[A] = ???
}""").tpe

然后可以销毁和检查类型检查的结果(通过树形转换器)以填充???这不能完全解决问题,产生类型错误:

found   : A(in method apply)(in method apply)(in method apply)...
required: A(in method apply)(in method apply)(in method apply)...

虽然untypecheck在返回树之前进行调用并没有帮助-但是对生成的树的检查显示,预期结果是有效的(类型正确)Scala代码。因此,使宏最终运行的最后一步是调用

parse(showCode(result))

感觉完全没有必要,但是这似乎是摆脱冲突类型信息的唯一方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将混合类型(可能是适用类型)的参数应用于函数的最佳方法

来自分类Dev

构造函数不能应用于给定类型吗?

来自分类Dev

类中的构造函数不能应用于给出类型

来自分类Dev

构造函数不能应用于 Java 中的给定类型

来自分类Dev

发生“无法将类JSONParser中的构造函数JSONParser应用于给定类型”的错误

来自分类Dev

将StructureMap构造函数参数应用于属性

来自分类Dev

使用命名参数时出现“错误:应用于此参数的函数的类型为...”

来自分类Dev

使用命名参数时出现“错误:应用于此参数的函数的类型为...”

来自分类Dev

编写应用于参数包的函数的类型

来自分类Dev

将存在类型的函数应用于足够多态的参数

来自分类Dev

反思:将声明类的类型参数应用于字段

来自分类Dev

Java“类中的构造函数不能应用于给定类型”“必需:找不到参数:字符串”

来自分类Dev

构造函数不能应用于给定类型;要求:包裹;实际和形式参数列表的长度不同

来自分类Dev

构造函数不能应用于给定类型?实际和形式参数列表的长度不同

来自分类Dev

RequestBody应用于太多类型参数

来自分类Dev

Java错误:类中的构造函数无法应用于给定类型

来自分类Dev

类中的java构造函数不能应用于给定类型

来自分类Dev

Android:类ContactsAdapter中的构造函数ContactsAdapter无法应用于给定类型

来自分类Dev

构造函数不能应用于给定的类型,并且应该声明名称

来自分类Dev

java:类中的构造函数ranngeIpScanner不能应用于给定的类型;

来自分类Dev

Java 构造函数中的泛型错误不能应用于给定类型

来自分类Dev

编译错误:A 类中的构造函数 A 不能应用于给定类型

来自分类Dev

将函数应用于元组中的每个元素,将每个元素转换为类型包中的不同类型,然后作为参数包传递

来自分类Dev

如何将Aspects应用于某些元素(例如,用于LocationInfo类型参数或PropertyInfo)?

来自分类Dev

如何使用 kotlinpoet 生成具有单个类型参数的 Kotlin“Unit”类型的构造函数参数?

来自分类Dev

类中的构造方法不能应用于给定的类型

来自分类Dev

将两个参数函数应用于列表以使用NumPy生成对称矩阵

来自分类Dev

将两个参数函数应用于列表以使用NumPy生成对称矩阵

来自分类Dev

SML:非构造函数应用于模式@中的参数

Related 相关文章

  1. 1

    将混合类型(可能是适用类型)的参数应用于函数的最佳方法

  2. 2

    构造函数不能应用于给定类型吗?

  3. 3

    类中的构造函数不能应用于给出类型

  4. 4

    构造函数不能应用于 Java 中的给定类型

  5. 5

    发生“无法将类JSONParser中的构造函数JSONParser应用于给定类型”的错误

  6. 6

    将StructureMap构造函数参数应用于属性

  7. 7

    使用命名参数时出现“错误:应用于此参数的函数的类型为...”

  8. 8

    使用命名参数时出现“错误:应用于此参数的函数的类型为...”

  9. 9

    编写应用于参数包的函数的类型

  10. 10

    将存在类型的函数应用于足够多态的参数

  11. 11

    反思:将声明类的类型参数应用于字段

  12. 12

    Java“类中的构造函数不能应用于给定类型”“必需:找不到参数:字符串”

  13. 13

    构造函数不能应用于给定类型;要求:包裹;实际和形式参数列表的长度不同

  14. 14

    构造函数不能应用于给定类型?实际和形式参数列表的长度不同

  15. 15

    RequestBody应用于太多类型参数

  16. 16

    Java错误:类中的构造函数无法应用于给定类型

  17. 17

    类中的java构造函数不能应用于给定类型

  18. 18

    Android:类ContactsAdapter中的构造函数ContactsAdapter无法应用于给定类型

  19. 19

    构造函数不能应用于给定的类型,并且应该声明名称

  20. 20

    java:类中的构造函数ranngeIpScanner不能应用于给定的类型;

  21. 21

    Java 构造函数中的泛型错误不能应用于给定类型

  22. 22

    编译错误:A 类中的构造函数 A 不能应用于给定类型

  23. 23

    将函数应用于元组中的每个元素,将每个元素转换为类型包中的不同类型,然后作为参数包传递

  24. 24

    如何将Aspects应用于某些元素(例如,用于LocationInfo类型参数或PropertyInfo)?

  25. 25

    如何使用 kotlinpoet 生成具有单个类型参数的 Kotlin“Unit”类型的构造函数参数?

  26. 26

    类中的构造方法不能应用于给定的类型

  27. 27

    将两个参数函数应用于列表以使用NumPy生成对称矩阵

  28. 28

    将两个参数函数应用于列表以使用NumPy生成对称矩阵

  29. 29

    SML:非构造函数应用于模式@中的参数

热门标签

归档