Uso del "Prólogo en Scala" para encontrar instancias de clase de tipo disponibles
shapeless constraint-programming (0)
Teniendo en cuenta https://speakerdeck.com/folone/theres-a-prolog-in-your-scala , me gustaría "abusar" del sistema de tipo Scala para encontrar todas las instancias de, por ejemplo, CanBuildFrom
que coincidan con un criterio dado. Estilo de prólogo, evaluaría algo en las líneas del siguiente pseudocódigo:
can_build_from(Src, int, list[int])
Src = somecollectiontype1[int]
Src = somecollectiontype2[int]
... etc
es decir, el tiempo de ejecución buscaría todos los valores para Src
que satisfacen la declaración can_build_from(Src, int, list[int])
.
Ahora, soy consciente de que el primitivo entorno de programación de restricciones / lógica, que es el sistema de búsqueda implícito de Scala, no debe utilizarse para tales trucos y no puede "devolver" más de un valor encontrado para Src
fuera de la caja, así que mi pregunta es: ¿hay un "truco de magia" para que funcione de modo que de alguna manera obtendría todos los valores posibles para X
en CanBuildFrom[X, Int, List[Int]]
?
Ejemplo adicional:
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] {}
ahora me gustaría consultar CanFoo[X, String]
y recuperar X ∈ [Int, Double, Boolean]
, o CanFoo[Int, X]
y recuperar X ∈ [String, Symbol]
.
Alternativamente, CanFoo[X, String]
devolvería List(canFooIntString, canFooDblString, canFooBoolString)
, es decir, todas las instancias de CanFoo
que coincidan.