Skip to content

Commit 013149c

Browse files
committed
add GADT test cases
1 parent c9b3e5e commit 013149c

File tree

8 files changed

+96
-0
lines changed

8 files changed

+96
-0
lines changed

tests/patmat/gadt-basic.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
object O1 {
2+
sealed trait Expr[T]
3+
case class BExpr(bool: Boolean) extends Expr[Boolean]
4+
case class IExpr(int: Int) extends Expr[Int]
5+
6+
def join[T](e1: Expr[T], e2: Expr[T]): Expr[T] = (e1, e2) match {
7+
case (IExpr(i1), IExpr(i2)) => IExpr(i1 + i2)
8+
case (BExpr(b1), BExpr(b2)) => BExpr(b1 & b2)
9+
}
10+
}
11+
12+
object O2 {
13+
sealed trait GADT[A, B]
14+
case object IntString extends GADT[Int, String]
15+
case object IntFloat extends GADT[Int, Float]
16+
case object FloatFloat extends GADT[Float, Float]
17+
18+
def m[A, B](g1: GADT[A, B], g2: GADT[A, B]) = (g1, g2) match {
19+
case (IntString, IntString) => ;
20+
case (IntFloat, IntFloat) => ;
21+
case (FloatFloat, FloatFloat) => ;
22+
}
23+
}

tests/patmat/gadt-covariant.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6: Pattern Match Exhaustivity: (BExpr(_), IExpr(_)), (IExpr(_), BExpr(_))

tests/patmat/gadt-covariant.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
object O {
2+
sealed trait Expr[+T]
3+
case class IExpr(x: Int) extends Expr[Int]
4+
case class BExpr(b: Boolean) extends Expr[Boolean]
5+
6+
def foo[T](x: Expr[T], y: Expr[T]) = (x, y) match {
7+
case (IExpr(_), IExpr(_)) => true
8+
case (BExpr(_), BExpr(_)) => false
9+
}
10+
}

tests/patmat/gadt-invariant.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
object O {
2+
sealed trait Expr[T]
3+
case class IExpr(x: Int) extends Expr[Int]
4+
case class BExpr(b: Boolean) extends Expr[Boolean]
5+
6+
def foo[T](x: Expr[T], y: Expr[T]) = (x, y) match {
7+
case (IExpr(_), IExpr(_)) => true
8+
case (BExpr(_), BExpr(_)) => false
9+
}
10+
}

tests/patmat/gadt-nontrivial.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7: Pattern Match Exhaustivity: (IntExpr(_), AddExpr(_, _))

tests/patmat/gadt-nontrivial.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
object O {
2+
sealed trait Expr[T]
3+
case class BoolExpr(v: Boolean) extends Expr[Boolean]
4+
case class IntExpr(v: Int) extends Expr[Int]
5+
case class AddExpr(e1: Expr[Int], e2: Expr[Int]) extends Expr[Int]
6+
7+
def join[T](e1: Expr[T], e2: Expr[T]): Expr[T] = (e1, e2) match {
8+
case (BoolExpr(b1), BoolExpr(b2)) => BoolExpr(b1 && b2)
9+
case (IntExpr(i1), IntExpr(i2)) => IntExpr(i1 + i2)
10+
case (AddExpr(ei1, ei2), ie) => join(join(ei1, ei2), ie)
11+
}
12+
}

tests/patmat/gadt-nontrivial2.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
object O {
2+
sealed trait Nat
3+
type Zero = Nat
4+
sealed trait Succ[N <: Nat] extends Nat
5+
6+
sealed trait NVec[N <: Nat, +A]
7+
case object NEmpty extends NVec[Zero, Nothing]
8+
case class NCons[N <: Nat, +A](head: A, tail: NVec[N, A]) extends NVec[Succ[N], A]
9+
10+
def nzip[N <: Nat, A, B](v1: NVec[N, A], v2: NVec[N, B]): NVec[N, (A, B)] =
11+
(v1, v2) match {
12+
case (NEmpty, NEmpty) => NEmpty
13+
case (NCons(a, atail), NCons(b, btail)) =>
14+
NCons((a, b), nzip(atail, btail))
15+
}
16+
}

tests/patmat/t9926.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
object Model {
2+
sealed trait Field[T]
3+
case object StringField extends Field[String]
4+
case object BoolField extends Field[Boolean]
5+
6+
sealed trait Value[T]
7+
case class Literal(v: String) extends Value[String]
8+
case class Bool(v: Boolean) extends Value[Boolean]
9+
10+
sealed trait Expression[T]
11+
case class Equality[T](field: Field[T], value: Value[T]) extends Expression[T]
12+
13+
def interpret[T](expr: Expression[T]): Int = expr match {
14+
case Equality(StringField, Literal(v)) => 1
15+
case Equality(BoolField, Bool(v)) => 2
16+
}
17+
18+
// T - T(s1, s2, ...)
19+
// if T contains type parameter, get its dimension types.
20+
//
21+
// actively decompose its dimensions, and then do subtype checking to
22+
// see if the type paramter can be instantiated.
23+
}

0 commit comments

Comments
 (0)