scala隐式def返回a和b

bakd9h0s  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(371)

我一直在绞尽脑汁反对这一点,我不知道是否有一种方法可以正确地做到这一点。我觉得我知道问题是什么,但不知道怎么解决。
我有个方法:

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隐式的调试,我相信它的调用 combineAlg[A with B, Nothing] .
我想找到一种方法来做一些事情,比如:

implicit def combineExpAlg[AB, A >: AB, B >: AB]

implicit def combineExpAlg[AB, A, B](implicit ev1: AB <:< A, ev2: AB <:< B)

因此,它明白它需要将“with”分开,但两者都没有帮助。
不确定是否有办法做到这一点,实际上这是一个实验,我正在做的“对象代数”在scala和我试图看看如何删除样板。
如果有解决办法那就太棒了。dotty解决方案也是可以接受的,因为我也在那里实现它,看看是否有一些新特性使它更简单。
如果需要更多信息,您可以在这里查看存储库,我尝试更改的是algebra.combineexpalg。它看起来像是在工作,因为我在algebra.interpreters.package中定义了特定的隐式,它具体地说明了每个解释器对,这就是我要概括的。

bsxbgnwa

bsxbgnwa1#

编译以下代码:

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

相关问题