gpt4 book ai didi

Scala:路径依赖类型的等价

转载 作者:行者123 更新时间:2023-12-02 21:10:47 24 4
gpt4 key购买 nike

如何解决我知道相同但编译器不知道的两个路径相关类型的等价问题?

我正在尝试使用 Scala 2.10.0 M7 将 AST 从一个宇宙转换为另一个宇宙。

case class MacroBridge(context: Context) {
def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}

在宏实现中,我可以将其用作:

val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

但是,这会导致编译器错误:

[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch;
[error] found : c.universe.Tree
[error] required: bridge.context.universe.Tree
[error] possible cause: missing arguments for method or constructor
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

在上面的代码中,c显然与bridge.context具有相同的值,但可能因为它是一个值类型检查器无法检查它。放置广义类型约束没有帮助:

def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =

在宏中这仍然会导致错误:

[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove that c.universe.Tree =:= bridge.context.universe.Tree.
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

我需要访问 context.universe,以便可以访问其他依赖类型,例如 TermName。除了强制转换之外还有更好的解决方法吗?:

def fromMacroTree(tree: c.universe.Tree): Tree =
bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree])

最佳答案

我可以执行以下操作:

case class MacroBridge[C <: Context](context: C) {
def fromMacroTree(tree: context.universe.Tree): context.universe.Tree = ???
}

trait MB {
def meth(c: Context) {
val bridge = MacroBridge[c.type](c)
def fromMacroTree(tree: c.universe.Tree): c.universe.Tree =
bridge.fromMacroTree(tree)
}
}

我几乎有 same problem前段时间。

关于Scala:路径依赖类型的等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com