2012-08-26 12 views
5

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 kodda c 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]) 
+0

belki de bir şey gibi birşeyden [T <: Tree] (ağaç: T): T = ??? ve 'fromMacroTree [tree.type] (ağaç)' yardımcı olur mu? – sschaef

+0

Sanırım her iki ağacın da ortak süper tipi var, denediniz mi? – pedrofurla

+0

@sschaef Hatayı aldım: 'type arguments [c.universe.Tree] yöntemi, MacroTree'ın type parametresi sınırlarından [T <: bridge.context.universe.Tree]' –

cevap

9

var mı elimden çalışmayı yapmak şunlardır: Neredeyse same problem bir süre önce vardı

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) 
    } 
} 

.

+0

'val köprüsü = treehugger.MacroBridge [c yöntemine uymuyor .type] (c) 'cevaptı. Teşekkürler! –

İlgili konular