Учитывая https://speakerdeck.com/folone/theres-a-prolog-in-your-scala, я хотел бы "злоупотреблять" системой типов Scala, чтобы найти все экземпляры, например. CanBuildFrom
, которые соответствуют заданным критериям. Пролог, я бы оценил что-то в строках следующего псевдокода:
can_build_from(Src, int, list[int])
Src = somecollectiontype1[int]
Src = somecollectiontype2[int]
... etc
то есть. runtime будет искать все значения для Src
, которые удовлетворяют утверждению can_build_from(Src, int, list[int])
.
Теперь я знаю, что примитивная среда ограничения/логического программирования, в которой неявная система поиска Scala, не предназначена для использования для таких трюков и не может "вернуть" более одного найденного значение для Src
из коробки, поэтому мой вопрос: есть ли "волшебный трюк", чтобы заставить его работать так, чтобы каким-то образом я получил все возможные значения для X
в CanBuildFrom[X, Int, List[Int]]
?
Дополнительный пример:
trait CanFoo[T, U]
implicit val canFooIntString = new CanFoo[Int, String] {}
implicit val canFooDblString = new CanFoo[Double, String] {}
implicit val canFooBoolString = new CanFoo[Boolean, String] {}
implicit val canFooIntSym = new CanFoo[Int, Symbol] {}
implicit val canFooDblSym = new CanFoo[Double, Symbol] {}
implicit val canFooBoolSym = new CanFoo[Boolean, Symbol] {}
теперь я хотел бы запросить CanFoo[X, String]
и вернуться X ∈ [Int, Double, Boolean]
, или CanFoo[Int, X]
и вернуться X ∈ [String, Symbol]
.
В качестве альтернативы CanFoo[X, String]
возвращает List(canFooIntString, canFooDblString, canFooBoolString)
, то есть все экземпляры CanFoo
, которые соответствуют.