Scala隐式定义返回A和B
我一直在绞尽脑汁反对这一点,我不知道是否有一种方法可以正确地做到这一点。 我觉得我知道问题是什么,但不知道如何解决它 我有一个方法:Scala隐式定义返回A和B,scala,generics,typeclass,implicit,dotty,Scala,Generics,Typeclass,Implicit,Dotty,我一直在绞尽脑汁反对这一点,我不知道是否有一种方法可以正确地做到这一点。 我觉得我知道问题是什么,但不知道如何解决它 我有一个方法: implicit def combineAlg[A: Alg, B: Alg]: Alg[A with B] = ... 如果我明确地称之为它,它工作得很好,但是它永远不会得到正确的暗示 // works implicit val comb: Alg[A with B] = combineAlg[A, B] // doesn't work implicit v
implicit def combineAlg[A: Alg, B: Alg]: Alg[A with B] = ...
如果我明确地称之为它,它工作得很好,但是它永远不会得到正确的暗示
// works
implicit val comb: Alg[A with B] = combineAlg[A, B]
// doesn't work
implicit val comb: Alg[A with B] = implicitly[Alg[A with B]]
通过我对-Xlog implicits的调试,我相信它的调用结合了[A和B,Nothing]
我正在寻找一种方法来做一些事情,比如:
implicit def combineExpAlg[AB, A >: AB, B >: AB]
或
implicit def combineExpAlg[AB,A,B](implicit ev1:AB编译以下代码:
trait Alg[T]
trait LowPriorityAlg {
implicit def bAlg: Alg[B0] = ???
}
object Alg extends LowPriorityAlg {
implicit def aAlg: Alg[A0] = ???
implicit def combineAlg[AB, A: Alg, B: Alg](implicit ev1: AB <:< A, ev2: AB <:< B): Alg[AB] = ???
}
trait A0
trait B0
val comb: Alg[A0 with B0] = Alg.combineAlg[A0 with B0, A0, B0]
val comb1: Alg[A0 with B0] = implicitly[Alg[A0 with B0]]
trait Alg[T]
性状低优先级{
隐式def bAlg:Alg[B0]=???
}
对象Alg扩展了LowPriorityAlg{
隐式定义aAlg:Alg[A0]=???
隐式def combineAlg[AB,A:Alg,B:Alg](隐式ev1:AB这很奇怪,给A0或B0中的一个赋予较低的优先级似乎可以做到这一点,你甚至可以交换它们,但仍然可以工作,但给它们相同的优先级会导致问题。没那么奇怪。如果A0
和B0
具有相同的优先级,那么使用scalacOptions+=“-Xlog implicits”
我们有警告信息:App.this.Alg.combineag不是App.Alg[App.A0和App.B0]的有效隐式值,因为:hasMatchingSymbol报告了错误:隐式值不明确:类型=>App.Alg[App.A0]的对象Alg中的方法aAlg和类型=>App.Alg[App.B0]的对象Alg中的方法bAlg匹配预期类型App.Alg[A]
。
trait Alg[T]
trait LowPriorityAlg {
implicit def bAlg: Alg[B0] = ???
}
object Alg extends LowPriorityAlg {
implicit def aAlg: Alg[A0] = ???
implicit def combineAlg[AB, A: Alg, B: Alg](implicit ev1: AB <:< A, ev2: AB <:< B): Alg[AB] = ???
}
trait A0
trait B0
val comb: Alg[A0 with B0] = Alg.combineAlg[A0 with B0, A0, B0]
val comb1: Alg[A0 with B0] = implicitly[Alg[A0 with B0]]