2016-08-25 4 views
0

Я редактировал это более простой форме вопроса, к которому @Zhi Юань Ван ответил:Scala: Тройная Context границы, параметры доказательства не найдены

object ContBound { 
    def f2[A: Seq, B: Seq]: Unit = { 
     val a1: Seq[A] = evidence$1 
     val b2: Seq[B] = evidence$2 
    } 

    def f3[A: Seq, B: Seq, C: Seq]: Unit = { 
    val a1: Seq[A] = evidence$1 
    val b2: Seq[B] = evidence$2 
    val a3: Seq[C] = evidence$3  
    } 
} 

я получаю следующие ошибки:

not found value evidence$1 
not found value evidence$2 
type mismatch; found :Seq[A] required: Seq[C] 

несмотря на получение следующих в РЕПЛ:

def f3[A: Seq, B: Seq, C: Seq]: Unit = 
| { 
|  val a1: Seq[A] = evidence$1 
|  val b2: Seq[B] = evidence$2 
|  val a3: Seq[C] = evidence$3  
| } 
f3: [A, B, C](implicit evidence$1: Seq[A], implicit evidence$2: Seq[B], implicit evidence$3: Seq[C])Unit 

awnser Чжи является правильным. Следующие компилирует:

object ContBound { 
    def f2[A: Seq, B: Seq]: Unit = { 
    val a1: Seq[A] = evidence$1 
    val b2: Seq[B] = evidence$2 
    } 

    def f3[A: Seq, B: Seq, C: Seq]: Unit = { 
    val a1: Seq[A] = evidence$3 
    val b2: Seq[B] = evidence$4 
    val a3: Seq[C] = evidence$5  
    } 
} 

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

+0

вы можете попробовать, глядя на выходе 'scalac -print', или сгенерированного байткод –

+0

Ваше понятие «правильно» неверно. –

ответ

2

Вы пробовали

def comma3[A: RParse, B: RParse, C: RParse, D](f: (A, B, C) => D): D = 
    expr match { 
     case CommaExpr(Seq(e1, e2, e3)) => 
      f(evidence$3.get(e1), evidence$4.get(e2), evidence$5.get(e3)) 
} 

с доказательства $ 1 уже используется

def comma3[]?? 
+0

Уже используется 'comma2', вы имеете в виду. И да, это все. А также показывает, почему вы никогда не должны полагаться на генерируемую компилятором нумерацию скрытых параметров. –

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