简体   繁体   English

Scala:三重上下文界限,找不到证据参数

[英]Scala: Triple Context Bounds, evidence parameters not found

I have edited this to a simpler form of the question to which @Zhi Yuan Wang responded : 我已将此问题编辑为@Zhi Yuan Wang回答的一个简单形式的问题:

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

I get the following errors: 我收到以下错误:

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

despite getting the following in the REPL: 尽管在REPL中获得了以下内容:

 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

Zhi's awnser is correct. 智的遮阳棚是正确的。 The following compiles: 编译如下:

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

However I still don't see this as correct behaviour, as these are parameters for two different methods and methods are normally allowed to reuse parameter names. 但是,我仍然不认为这是正确的行为,因为这是两种不同方法的参数,通常允许方法重用参数名称。

Have you tried 你有没有尝试过

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

since the the evidence$1 already used by 因为证据$ 1已被

def comma3[]??

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM