我知道Scala中不支持“联合类型”,但交集类型又如何呢?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
或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)
可能您可以编写一个派生此类集的宏吗?只要它有权访问类层次结构,它应该是可能的。 – Ashalynd
我不太明白你期望的输出。你能举一个可能的输入值和预期输出的例子吗? – drexin
我没有看到这个用例。你为什么不使用套件? – drexin