2014-01-22 75 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

是的,误解了这个问题 –