我知道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