Разверните операции класса типов над элементами с помощью макросов

Предполагая следующую настройку:

trait A[L] { def op(l1:L, l2:L): L }
trait E[L] { def op(l:L): L }

implicit def some2E[L:A](self:L) =  new E[L] { def op(other:L) =      
  implicitly[A[L]].op(self,other) }

Есть ли способ напрямую расширить m op n в a.op(m,n)в контексте, где a это соответствующий неявный A, используя макросы или хотя бы избежать создания дополнительного объекта?

1 ответ

Решение

Если вы переместите неявный параметр в op Метод, вы можете использовать класс значений, чтобы предотвратить создание дополнительного объекта:

implicit class some2E[L](val self: L) extends AnyVal {
 def op(other: L)(implicit x: A[L]) = x.op(self, other)
}

Hotspot, вероятно, встроит звонок вop определяется в some2Eтак что вы в конечном итоге a.op(m, n),

Другие вопросы по тегам