object Main extends App {
val t1 = "test1"
val t2 = "test2"
trait F[T] { type R; def value: R }
implicit val t1F = new F[t1.type] { override type R = Int; override def value = 1 }
implicit val t2F = new F[t2.type] { override type R = Unit; override def value = () }
def a[T](x: T)(implicit i: F[T]): i.R = i.value
println(a[t1.type](t1))
println(a[t2.type](t2))
}