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