3

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の交差にある型になります。AB

私の使用例では、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)
4

2 に答える 2

2

ziggystar が上記で正しく述べられているように:A & BA with BScala にあります。

実行時に随伴型を作成するという事実に関しては、C取得した型に基づいて、実行時にこの型を作成する必要がありAますB

これに対する解決策、または少なくとも手がかりは、How to mix-in a trait to instance? で見つけることができます。.

ただし、ユースケースで必要なのはhttp://en.wikipedia.org/wiki/Dependent_typeのケースです。依存型は Scala ではサポートされていませんが、いつでも Agda を試すことができます ;)

于 2013-10-17T22:59:54.637 に答える
0

++そこにあるので実装として使用します。は不変であるため、intersectonSetは機能しません。Setこれが意味をなさない場合は、無視してください。

def intersect[C, A <: C, B <: C](as: Seq[A], bs: Seq[B]): Seq[C] = as ++ bs
于 2013-10-17T15:42:04.510 に答える