我一直在为此苦恼,我不知道是否有办法正确地做到这一点。我觉得我知道问题是什么,但不知道如何解决。
我有一个方法:
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)
以便它了解它需要将“与”分开,但两者都没有帮助。
不确定是否有办法做到这一点,实际上这是我在 Scala 中为“对象代数”做的一个实验,我正在尝试看看如何删除样板。
如果有解决方案,那就太棒了。一个 dotty 解决方案也是可以接受的,因为我也在那里实现它,看看是否有一些新功能使它更简单。
如果需要更多信息,您可以在此处查看存储库 我要更改的是 algebra.combineExpAlg。看起来它正在工作,因为我在 algebra.interpreters.package 中定义了特定的隐含,专门拼出每个解释器对,这就是我想要概括的内容。