Bildiğim iki yol bağımlı türünün eşdeğerliğini nasıl elde edebilirim ama derleyici değil mi?Scala: Yola bağlı türlerin eşdeğeri
Scala'yı Kullanma 2.10.0 M7 Bir AST'yi bir evrenden diğerine dönüştürmeye çalışıyorum.
val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
Ancak bu bir derleyici hatasına neden olur:
Yukarıdaki koddac
yılında
[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)
açıkça aynı olan bir makro uygulaması dahilinde
case class MacroBridge(context: Context) {
def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}
, ben olarak kullanabilirsiniz bridge.context
olarak değer, ancak belki bir değer türü denetleyicisi bunu denetleyemediğinden. genelleştirilmiş tür kısıtlaması yardım etmedi koymak:
def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =
bu hala bir hata sonuçlandı makroda:
[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)
Ben bu yüzden TermName
gibi diğer bağımlı türlerine alabilirsiniz context.universe
erişmesi gerekir. döküm yanında etrafında daha iyi bir çalışma ?:
def fromMacroTree(tree: c.universe.Tree): Tree =
bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree])
belki de bir şey gibi birşeyden [T <: Tree] (ağaç: T): T = ??? ve 'fromMacroTree [tree.type] (ağaç)' yardımcı olur mu? – sschaef
Sanırım her iki ağacın da ortak süper tipi var, denediniz mi? – pedrofurla
@sschaef Hatayı aldım: 'type arguments [c.universe.Tree] yöntemi, MacroTree'ın type parametresi sınırlarından [T <: bridge.context.universe.Tree]' –