Я бился головой об этом и не могу понять, есть ли способ сделать это правильно.Я чувствую, что знаю, в чем проблема, но не знаю, как ее решить.
У меня есть метод:
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 и пытаюсь понять, как удалить шаблон.
Было бы замечательно, если бы было решение.Дотти-решение также было бы приемлемо, так как я также реализую его там, чтобы посмотреть, не упростят ли некоторые из новых функций.
В случае, если требуется дополнительная информация, вы можете просмотреть репозиторий здесь Я пытаюсь изменить это algebra.combineExpAlg.Похоже, что это работает, потому что я определяю конкретные последствия в algebra.interpreters.package, в которых конкретно прописана каждая пара интерпретаторов, что я и пытаюсь обобщить.