2014-01-22 2 views
2

В следующем коде вы можете увидеть некоторые грандиозный повторный ввод:А метод локального псевдоним типа

implicit def intEqualInstance 
    [ root, 
    path <: TypePath[root] ] 
    (implicit mappingResolver: rel.rules.MappingResolver[path]) 
    = { 
    new genExp.Compiler 
     [ genExp.templates.Where.Comparison[root, path, genExp.templates.Operator.Equal, typeLevel.Bool], 
     genExp.values.Where.Comparison[ genExp.values.Expression.Value[ Int ] ], 
     relExp.templates.Where, 
     List[rel.Value] ] 
     { 
     override def compileTemplate(tpl: genExp.templates.Where.Comparison[root, path, genExp.templates.Operator.Equal, typeLevel.Bool]) = { 
      ... 
     } 
     override def processValues(vals: genExp.values.Where.Comparison[ genExp.values.Expression.Value[ Int ] ]) = { 
      ... 
     } 
     } 
    } 

Я хочу объявить псевдонимы типа для повторяющихся типов.

Я попытался добавить подтипов ограничения, как и в дальнейшем, но это делает неявное разрешение терпеть неудачу:

implicit def intEqualInstance 
    [ ..., 
    inputTemplate <: genExp.templates.Where.Comparison[root, path, genExp.templates.Operator.Equal, typeLevel.Bool], 
    inputValues <: genExp.values.Where.Comparison[ genExp.values.Expression.Value[ Int ] ] ] 
    (implicit mappingResolver: rel.rules.MappingResolver[path]) 
    = { 
    new genExp.Compiler 
     [ inputTemplate, 
     inputValues, 
     ... ] 
     { 
     override def compileTemplate(tpl: inputTemplate) = ... 
     override def processValues(vals: inputValues) = ... 
     } 
     ... 

Добавление локальных псевдонимов типа, делает неявное разрешение терпеть неудачу также:

implicit def intEqualInstance 
    ... 
    = { 
    type InputTemplate = genExp.templates.Where.Comparison[root, path, genExp.templates.Operator.Equal, typeLevel.Bool] 
    type InputValues = genExp.values.Where.Comparison[ genExp.values.Expression.Value[ Int ] ] 
    new genExp.Compiler 
     [ InputTemplate 
     InputValues, 
     ... ] 
     ... 

Есть ли решение для этого?

ответ

1

Лучшее, что я мог придумать было объявить псевдонимы типа во внешнем объеме:

private type InputTemplate[root, path <: TypePath[root]] = 
    genExp.templates.Where.Comparison[root, path, genExp.templates.Operator.Equal, typeLevel.Bool] 
private type InputValues = 
    genExp.values.Where.Comparison[ genExp.values.Expression.Value[ Int ] ] 

implicit def intEqualInstance 
    [ root, path <: TypePath[root] ] 
    (implicit mappingResolver: rel.rules.MappingResolver[path]) 
    = 
    new genExp.Compiler 
    [ InputTemplate[root, path], InputValues, ... ] 
    { 
     override def compileTemplate(tpl: InputTemplate[root, path]) = ... 
     override def processValues(vals: InputValues) = ... 
    } 
+0

вы можете определить псевдонимы в какой-либо объект (чтобы ограничить сферу их применения), а затем импортировать псевдонимы этого объекта внутри метода: 'def foo {import AliasesHolder._ ...}' –

+0

@ om-nom-nom Я так не думаю, так как локально псевдонимы, объявленные в теле функции, не сработали, и в чем разница. –

+0

Да, неправильно поняли проблему –

Смежные вопросы