考虑到https://speakerdeck.com/folone/theres-a-prolog-in-your-scala,我想“滥用”Scala 类型系统来查找所有CanBuildFrom
符合给定条件的 eg 实例。Prolog 风格,我将评估以下伪代码行中的内容:
can_build_from(Src, int, list[int])
Src = somecollectiontype1[int]
Src = somecollectiontype2[int]
... etc
即运行时将查找Src
满足语句的所有值can_build_from(Src, int, list[int])
。
现在,我知道 Scala 隐式查找系统所在的原始约束/逻辑编程环境并不打算用于此类技巧,并且不能“返回”超过一个找到Src
的值盒子,所以我的问题是:是否有一个“魔术”让它工作,以便我以某种方式获得X
in的所有可能值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
该匹配的所有实例。