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)