Scala 隐式 def 返回 A 和 B
Scala implicit def returning A with B
我一直在为这个问题绞尽脑汁,我不知道是否有办法正确地做到这一点。
我觉得我知道问题是什么,但不知道如何解决。
我有一个方法:
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 的调试,我相信它调用 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 中为 "object algebras" 做的一个实验,我正在尝试了解如何删除样板文件。
如果有解决方案就好了。
点解决方案也是可以接受的,因为我也在那里实施它以查看是否有一些新功能使其更简单。
如果需要更多信息,您可以查看存储库 here
我想要改变的是 algebra.combineExpAlg。
它看起来像是在工作,因为我在 algebra.interpreters.package 中定义了特定的隐式,具体说明了每个解释器对,这就是我要概括的内容。
编译以下代码:
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]]
我一直在为这个问题绞尽脑汁,我不知道是否有办法正确地做到这一点。 我觉得我知道问题是什么,但不知道如何解决。
我有一个方法:
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 的调试,我相信它调用 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 中为 "object algebras" 做的一个实验,我正在尝试了解如何删除样板文件。
如果有解决方案就好了。 点解决方案也是可以接受的,因为我也在那里实施它以查看是否有一些新功能使其更简单。
如果需要更多信息,您可以查看存储库 here 我想要改变的是 algebra.combineExpAlg。 它看起来像是在工作,因为我在 algebra.interpreters.package 中定义了特定的隐式,具体说明了每个解释器对,这就是我要概括的内容。
编译以下代码:
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]]