Где поместить неявное значение для включения неявного преобразования о одноэлементном типе

Рассмотреть дело:

class T[A0, B0](val a: A0, val b: B0)
class A
class B(val a: A) {
  b =>
  implicit def t: T[a.type, b.type] = new T(a, b)
}
val b = new B(new A)
val t1 = implicitly[T[b.a.type, b.type]]// can't compile, I want t1 = b.t

Как включить неявное преобразование параметра типа singleton?

Рассмотрим компромисс:

class T[A0, B0, H0](val a: A0, val b: B0)
class A
class B(val a: A) {
  b =>
  class H
  object H{
    implicit def t: T[a.type, b.type, b.H] = new T(a, b)        
  }
}
val a = new A
val b = new B(a)
val t1 = implicitly[T[b.a.type, b.type, b.H]]

Это работает, но выглядит уродливо. Есть ли какой-то хороший метод?

1 ответ

  1. Мы можем просто добавить import b._.

    class T[A0, B0](val a: A0, val b: B0)
    class A
    class B(val a: A) {
      b =>
      implicit def t: T[a.type, b.type] = new T(a, b)
    }
    val b = new B(new A)
    import b._
    val t1 = implicitly[T[b.a.type, b.type]]