我知道 Scala 不支持“联合类型”,但是交集类型呢?
简而言之,我想要这样的功能:
def intersect[A,B,C](a: A, b: B): C = ??? // a & b
或一种方法:
class A {
def intersect[B, C](b: B): C = ??? // this & b
}
A
并B
共享一个共同的超类,以确保相交操作的有效性,并且C
将是A
or的交集处的类型B
。
在我的用例中,A 或 B 代表变量或常量(相同类型)。我想从类中区分一个常量和一个具有单例域的变量。如果我尝试将一个集合与一个值相交,我会返回该值(或者如果该值不在集合中,则返回空集/抛出异常)。
这是预期输出的示例:
trait IntExpression {
// Correct signature to be determined
def intersect [A <: IntExpression, B <: A & this.type] (that: A): B
}
case class IntVariable(domain: Seq[Int]) extends IntExpression
case class IntConstant(value: Int) extends IntExpression
val a = IntVariable(1,2,3)
val b = IntVariable(2,3,4)
val c = IntConstant(2)
接着:
a intersect b == b intersect a == IntVariable(2,3)
a intersect c == c intersect a == IntConstant(2)