【问题标题】:Scala: Triple Context Bounds, evidence parameters not foundScala:三重上下文边界,找不到证据参数
【发布时间】:2017-01-01 22:41:57
【问题描述】:

我已将其编辑为@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      
  }   
}

我收到以下错误:

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

尽管在 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 的遮阳篷是正确的。以下编译:

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

但是我仍然不认为这是正确的行为,因为这些是两种不同方法的参数,并且通常允许方法重用参数名称。

【问题讨论】:

  • 您可以尝试查看scalac -print 的输出,或者查看生成的字节码
  • 你的“正确”概念是不正确的。

标签: scala context-bound


【解决方案1】:

你试过了吗

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[]??

【讨论】:

  • 已经被comma2 使用了,你的意思是。是的,就是这样。并且还说明了为什么你永远不应该依赖编译器生成的隐藏参数编号。
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多