由 Scala 宏生成时,依赖类型似乎“不起作用”

2024-02-10

为这个挥手的标题道歉。我不完全确定如何简洁地表达这个问题,因为我以前从未遇到过这样的事情。

背景资料:

我有以下特征,其中类型U是为了举行无形可扩展记录 https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records type:

trait Flattened[T] {
  type U <: shapeless.HList
  def fields: U
}

我正在使用黑盒宏(出于本问题范围之外的原因)来创建该特征的新实例:

object flatten {

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

  def apply[T](struct: T): Flattened[T] =
    macro impl[T]

  def impl[T : c.WeakTypeTag](c: Context)(struct: c.Tree): c.Tree = {
    import c.universe._

    // AST representing a Shapeless extensible record (actual
    // implementation uses values in `struct` to construct this
    // AST, but I've simplified it for this example).
    val fields: Tree = q"""("a" ->> 1) :: ("b" ->> "two") :: ("c" ->> true) :: HNil"""

    // Result type of the above AST
    val tpe: TypeTree = TypeTree(c.typecheck(q"$fields").tpe)

    q"""
    new Flattened[${weakTypeOf[T]}] {
      import shapeless._
      import syntax.singleton._
      import record._

      type U = $tpe
      val fields = $fields
    }
    """
  }
}

问题:

问题是,当我使用这个宏创建一个新实例时Flattened,类型fields不再是可扩展的记录:

import shapeless._
import syntax.singleton._
import record._

val s = "some value... it doesn't matter for this example, since it isn't used. I'm just putting something here so the example compiles and runs in a REPL."
val t = flatten(s)

val fields = t.fields
// fields: t.U = 1 :: "two" :: true :: HNil

fields("a")  // compile error!

// The compile error is:
//     cmd5.sc:1: No field String("a") in record ammonite.$sess.cmd4.t.U
//     val res5 = fields("a")
//                      ^
//     Compilation Failed

边注:

奇怪的是,如果我手动执行宏的操作,它会起作用:

// I can't actually instantiate a new `Flattened[_]` manually, since
// defining the type `U` would be convoluted (not even sure it can be
// done), so an object with the same field is the next best thing.
object Foo {
  import shapeless._
  import syntax.singleton._
  import record._

  val fields = ("a" ->> 1) :: ("b" ->> "two") :: ("c" ->> true) :: HNil
}

val a = Foo.fields("a")
// a: Int = 1

val b = Foo.fields("b")
// b: String = "two"

val c = Foo.fields("c")
// c: Boolean = true

为什么会出现这种差异?如何使宏版本的行为与手动版本相同?


你的宏可能没有问题。这是类型签名:

def apply[T](struct: T): Flattened[T] = macro impl[T]
def impl[T : c.WeakTypeTag](c: Context)(struct: c.Tree): c.Tree

您正在使用黑盒宏,并且根据文档 https://docs.scala-lang.org/overviews/macros/blackbox-whitebox.html#blackbox-and-whitebox-macros,黑盒宏忠实于它们的签名。也就是说,尽管impl产生一个Flattened[T] { type U = ... },它是一个黑盒宏这一事实意味着scalac总是把它包裹起来(_: Flattened[T]),忘记了定义U在细化中。使其成为白盒宏:

// import scala.reflect.macros.blackbox.context // NO!
import scala.reflect.macros.whitebox.context
def impl[T: c.WeakTypeTag](c: Context)(struct: c.Tree): c.Tree
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由 Scala 宏生成时,依赖类型似乎“不起作用” 的相关文章

  • 如何列出所有 sbt 依赖项?

    我需要列出所有 sbt 依赖项 以便检查是否已存在 debian 软件包 我还注意到有一个 DEB 包 http www scala sbt org 0 13 tutorial Installing sbt on Linux html但似乎
  • Play框架:读取包含空值的Json

    我正在尝试在 Play Scala 程序中读取 Json 数据 Json 的某些字段可能包含空值 因此我定义 Reads 对象的方式如下 implicit val readObj Reads ApplyRequest JsPath a re
  • Scala 中的 Apply 和 lambda

    我有下面的代码 scala gt val builder new StringBuilder foo bar baz builder StringBuilder foo bar baz scala gt 0 until 5 foreach
  • Spark Streaming 中是否需要检查点

    我注意到 Spark 流示例也有检查点代码 我的问题是检查点有多重要 如果是为了容错 那么在此类流应用程序中发生故障的频率是多少 这一切都取决于您的用例 假设您正在运行一个流作业 它仅从 Kafka 读取数据并计算记录数 如果您的应用程序在
  • 带可变参数的 Spark UDF

    如文档中所示 列出最多 22 个参数是唯一的选择吗 https spark apache org docs 1 5 0 api scala index html org apache spark sql UDFRegistration ht
  • Scala REPL / SBT Console 是否有配置文件?

    我一直在尝试找到某种点文件来放入 Scala REPL 设置和自定义函数 我特别有兴趣传递它的标志 例如 Dscala color 启用语法突出显示 以及覆盖设置 如结果字符串截断 scala gt power scala gt vals
  • 如何初始化子类型中特征的值?

    如果我写 trait T val t 3 val u 1 t Nil class U extends T override val t 2 new U u 它表明了这一点 List 1 0 我应该如何更改上面的代码以使其显示以下内容 Lis
  • Scalaz 拆箱标记类型不会自动拆箱

    Reading http eed3si9n com learning scalaz Tagged type html http eed3si9n com learning scalaz Tagged type html并尝试示例代码 imp
  • 将当前类作为 scala 中的参数传递

    如何传递当前类作为参数 在java中我们这样做 mymethod this class or mymethod MyClass class 如何将 scala 当前类传递给此方法 this getClass or classOf MyCla
  • Scala 匿名函数中的 return 语句

    为什么显式 return 语句 使用return关键字 在匿名函数中从封闭的命名函数返回 而不仅仅是从匿名函数本身返回 例如 以下程序会导致类型错误 def foo String x Integer gt return x foo 我知道建
  • 对 Spark 数据集中的数字字符串进行排序

    假设我有以下内容Dataset productCode amount XX 13 300 XX 1 250 XX 2 410 XX 9 50 XX 10 35 XX 100 870 Where productCode is of Strin
  • 相当于 scala 中的 python repr()

    有没有相当于Python的东西reprscala 中的函数 即 您可以给任何 scala 对象提供一个函数 它将生成该对象的字符串表示形式 该对象是有效的 scala 代码 eg val l List Map 1 gt a print re
  • WSClient - 打开的文件太多

    我正在 CentOS 6 上使用 Play Framework 2 4 我的应用程序抛出此异常 java net SocketException Too many open files 我在 Stack Overflow 上搜索了很多主题并
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel
  • SBT插件——编译前执行自定义任务

    我刚刚编写了我的第一个 SBT 自动插件 它有一个生成设置文件的自定义任务 如果该文件尚不存在 当显式调用任务时 一切都会按预期工作 但我希望在使用插件编译项目之前自动调用它 无需项目修改其 build sbt 文件 有没有办法实现这一点
  • 如何在每行中添加行号?

    假设这些是我的数据 Maps and Reduces are two phases of solving a query in HDFS Map is responsible to read data from input location
  • Slick 中的 Scala 枚举(案例对象),良好实践

    假设我有一个代表一组几个有效状态的特征 将对象存储在数据库中是一个好习惯吗 存储 Int 并使用隐式函数 MappedColumnType base Int DoorState 将它们映射到 DoorState 会更好吗 trait Doo
  • 如何最好地处理 Future.filter 谓词不满足类型错误

    我喜欢 scala 的类型安全性 但我不断遇到的一个运行时错误是 Future filter predicate is not satisfied 我知道为什么会出现此错误 只是寻求有关如何最好地解决此错误并优雅地处理它的建议 或者也许我做
  • Scala 将集合转变为按键映射的最佳方法?

    如果我有一个收藏c类型的T并且有一个属性p on T 类型P 说 最好的方法是什么按提取键映射 val c Collection T val m Map P T 一种方法如下 m new HashMap P T c foreach t gt
  • 在 scala 中混合类型参数和抽象类型

    我正在尝试使用的答案前面的问题 https stackoverflow com questions 2059601 circular type parameters definition in scala实现一个小型图形库 这个想法是将图视

随机推荐

  • 在 Clojure 命名空间中排除 java.lang.*

    是否有可能从 Clojure 命名空间中的 java lang 中排除类名 我需要使用像 Byte 和 String 这样的变量 这里 java lang 类名就出现了 也许类似 ns my ns exclude java lang 如果您
  • 何时使用重新编译

    请耐心等待 我无法包含我的 1 000 多行程序 并且描述中有几个问题 所以我正在寻找几种类型的模式 literally just a regular word re search Word arg Varying complex patt
  • 如何重命名大量文件

    我有一个包含这样的文件的目录 a JPG b JPG c JPG 我想做这样的事情 git mv a JPG a jpg 我尝试使用 xargs 和其他工具 但似乎没有任何效果 该解决方案的核心是使用一种工具 方法来自动执行批量重命名 您可
  • 将knockout.js 与django 表单一起使用?

    我希望向我的客户端代码添加一些结构 并且一直在阅读knockout js 我一直在阅读文档并有一个简单的问题要问 因为淘汰赛要求用户添加data bindhtml 元素的属性 它的最佳使用方式是什么django表格 因为目前我正在使用 fo
  • jmeter http请求的每个线程的唯一ID

    我的 jmeter 测试发出一个包含唯一 ID 的 http 请求 http myserver com uniqueId 我想为每个线程设置基数 比如 35000 和增量 例如我的 id 是 35001 35002 35003 http m
  • 类的指针与非指针成员

    我的问题是 假设我们有两个类 A 和 B 我想在 A 类中有一个 B 的对象 我应该使用 class A public A A B b or class A public A A B b 据我所知 在第一种情况下 我可以初始化对象 b us
  • C# - 带种子的随机数

    我有这个代码 var rand new Random 0 for int i 0 i lt 100 i Console WriteLine rand Next 0 100 程序应该给我相同数字的 100 倍 因为种子是相同的 但它给出了不同
  • 如何仅打印 hexdump 中的十六进制值而不显示行号或 ASCII 表? [复制]

    这个问题在这里已经有答案了 下列的在 UNIX shell 脚本中将十进制转换为十六进制 https stackoverflow com questions 378829 convert decimal to hexadecimal in
  • 串口通信初始化

    目前我们正在尝试创建一个串行通信接口 以便能够与微处理器进行通信 事实上 一切都很好 几乎 为了能够与我们的控制器通信 我们需要与其同步 为此 我们编写一个字符串 0 SY 13 然后控制器应该回复 0 SY F5 接受同步请求 为此 我们
  • 名称或类型具有某种语言链接意味着什么?

    根据 c ANSI ISO IEC 14882 2003 第 127 页 联动规格嵌套 当链接规范嵌套时 最里面的规范决定语言 链接规范不建立范围 链接规范仅应出现在名称空间范围内 3 3 在链接规范中 指定的语言链接适用于声明引入的所有函
  • 从 bash 执行 MySQL 查询时如何获取受影响的行数?

    我知道如何从 bash 执行 MySQL 查询 命令 mysql u user p pass e mysql commands or mysql u user p pass lt lt QUERY INPUT mysql commands
  • Prolog 中的自定义数据结构语法

    在序言中 H T 是开头的列表H以及剩余元素在列表中的位置T 内部表示为 H 是否可以以类似的方式定义新语法 例如 是否可以定义 T H 是以以下结尾的列表H以及剩余元素在列表中的位置T 然后像这样自由地使用它 H T 在谓词的头部和主体中
  • 如何在 jQuery UI Datepicker 中将 minDate 设置为当前日期?

    这是我的代码 它无法正常工作 我想设置minDate到当前日期 我该怎么做 input DateFrom datepicker changeMonth true changeYear true dateFormat yy mm dd max
  • Python:根据字典中的内容从列表中获取字典

    我需要能够在 a 中找到一个项目list 本例中的一个项目是dict 基于其中的某个值dict 的结构list我需要处理如下 title some value value 123 4 id an id title another title
  • MSTest 测试方法依赖注入

    我正在使用 DI 容器 并且想要使用从容器解析的实例进行 MSTest VS 2010 单元测试 我想将这些实例注入到我的 TestMethod 或至少是我的 TestClass 中 这可能吗 现在我的 TestMethods 直接调用co
  • 根据项目的特殊属性从列表中删除项目[重复]

    这个问题在这里已经有答案了 我有一个由我定义的项目组成的列表 每个项目都有一个属性 name t item1 item2 我想根据其属性从 t 列表中删除项目 name 如remove 或pop 方法 也许我可以做类似的事情 t remov
  • C# 从文件序列化数据契约

    我有一个 Xml 消息列表 特别是我记录到文件中的 DataContract 消息 我正在尝试将它们从文件中一一反序列化 我不想立即将整个文件读入内存 因为我预计它会很大 我有这个序列化的实现并且有效 我通过使用 FileStream 进行
  • ARCORE:通过单击此可渲染对象来删除特定的可渲染对象

    我正在开发一个使用 ARCore 的 Sceneform 的项目 我基于ARCore提供的HelloSceneform示例进行开发 我想要做的是通过点击添加一个可渲染对象 然后当我单击屏幕上的特定可渲染对象时将其删除 我已经尝试了方法 An
  • 在原生 Javascript 中查找具有类的元素的索引

    有没有办法获取类名的索引 即 类 className 的第三个元素将是 3 而不使用 jQ 我不了解jQ 而且我现在没有时间学习它 而且我不想在我的代码中包含至少一些我不理解的代码 Thanks 顺便说一句 我使用了 jQ 而不是拼写出来
  • 由 Scala 宏生成时,依赖类型似乎“不起作用”

    为这个挥手的标题道歉 我不完全确定如何简洁地表达这个问题 因为我以前从未遇到过这样的事情 背景资料 我有以下特征 其中类型U是为了举行无形可扩展记录 https github com milessabin shapeless wiki Fe