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

是的,誤解了這個問題 –