Considering https://speakerdeck.com/folone/theres-a-prolog-in-your-scala, I would like to "abuse" the Scala type system to find all instances of e.g. CanBuildFrom
that match a given criteria. Prolog style, I would evaluate something in the lines of the following pseudocode:
can_build_from(Src, int, list[int])
Src = somecollectiontype1[int]
Src = somecollectiontype2[int]
... etc
i.e. the runtime would look up all the values for Src
that satisfy the statement can_build_from(Src, int, list[int])
.
Now, I'm aware that the primitive constraint/logic programming environment, which the Scala implicit lookup system is, isn't meant to be used for such tricks and is not able to "return" more than one found value for Src
out of the box, so my question is: is there a "magic trick" to make it work so that somehow I'd get all the possible values for X
in CanBuildFrom[X, Int, List[Int]]
?
Additional example:
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] {}
now I'd like to query CanFoo[X, String]
and get back X ∈ [Int, Double, Boolean]
, or CanFoo[Int, X]
and get back X ∈ [String, Symbol]
.
Alternatively, CanFoo[X, String]
would return List(canFooIntString, canFooDblString, canFooBoolString)
, i.e. all instances of CanFoo
that match.
question from:
https://stackoverflow.com/questions/26723337/using-the-prolog-in-scala-to-find-available-type-class-instances 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…