【问题标题】:Scala implicit typeclass precedence in companion objects伴随对象中的Scala隐式类型类优先级
【发布时间】:2016-08-24 00:17:25
【问题描述】:
trait Eq[-A] {
  def eq(a: A, b: A): Boolean
}
object Eq {
  implicit object IntEq extends Eq[Int] {
    def eq(a: Int, b: Int) = a == b
  }
}

trait Supertrait[+A]
object Supertrait {
  implicit def Eq[A: Eq]: Eq[Supertrait[A]] = ???
}

trait Subtrait[+A] extends Supertrait[A]
object Subtrait {
  implicit def Eq[A: Eq]: Eq[Subtrait[A]] = ???
}

def f[A](x: Subtrait[A])(implicit ev: Eq[Subtrait[A]]) = ???

f(new Subtrait[Int] {})

编译这段代码时,出现如下错误:

Error:(32, 4) ambiguous implicit values:
 both method Eq in object Supertrait of type [A](implicit evidence$1: Eq[A])Eq[Supertrait[A]]
 and method Eq in object Subtrait of type [A](implicit evidence$2: Eq[A])Eq[Subtrait[A]]
match expected type Eq[Subtrait[Int]]
  f(new Subtrait[Int] {})
   ^

为什么Subtrait 伴随对象中的implicit def 的优先级不高于Supertrait 中的优先级?

我希望子特征的伴随对象中的implicit defs 比超特征中的优先级更高。

更新

LowPriorityImplicits 技巧也不起作用。见Enforcing precedence in implicit instances in Scala

【问题讨论】:

    标签: scala implicit companion-object


    【解决方案1】:

    您的代码似乎违反了隐含的非歧义规则

    来自Scala 编程,第 1 版:

    Non-Ambiguity Rule:隐式转换仅在存在时插入 是没有其他可能的转换插入。如果编译器有两个 修复 x + y 的选项,例如使用 convert1(x) + y 或 convert2(x) + y,则会报错,拒绝在它们之间进行选择。可以定义某种“最佳匹配”规则 比其他人更喜欢某些转换。然而,这样的选择会导致 真的很晦涩的代码。想象一下编译器选择了convert2,但是你 是文件的新手,只知道 convert1——你可以花一个 很多时间都在考虑应用了不同的转换!

    全文见here

    【讨论】:

    • 我知道这一点,但我想在这些隐式类型类上定义一些优先关系。
    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2016-02-27
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多