У меня есть черта Foo[T, U]
и алгоритм уровня типа, который задает L <: HList
и целевой тип U
, сообщает мне, существует ли T
в L
, такое что есть неявное Foo[T, U]
в области видимости. Это реализовано с использованием следующего класса типов:
trait Search[L <: HList, U]
object Search {
def apply[L <: HList, U](implicit s: Search[L, U]): U = null
...
}
и у нас есть следующее:
object Test {
type L = Int :: String :: HNil
implicit val foo: Foo[String, Boolean] = null
Search[L, Boolean] //compiles
Search[L, Double] //does not compile
}
Я бы хотел, чтобы поиск вообще не проводился, если в области нет Foo[T, U]
ни для одного T
, поскольку тогда мы уже знаем, что алгоритм не завершится. Другими словами, мне нужен класс типа trait Exists[F[_]]
, экземпляры которого существуют тогда и только тогда, когда в области видимости есть хотя бы один неявный F
, поэтому функция Search.apply
вместо этого имеет подпись:
def apply[L <: HList, U](implicit ev: Exists[Foo[_, U]], s: Search[L, U]): U = null
В этом случае компилятор будет пытаться разрешить s
только в том случае, если в области видимости есть неявное Foo
.
Можно ли определить такой тип-класс? Он уже существует?