Created
March 10, 2017 01:32
-
-
Save quelgar/6ce991d312eae83eeb0c6e84316af4be to your computer and use it in GitHub Desktop.
Basic GADT in Scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Scala version of code from https://en.wikipedia.org/wiki/Generalized_algebraic_data_type | |
sealed abstract class Expr[A] | |
final case class EBool(a: Boolean) extends Expr[Boolean] | |
final case class EInt(a: Int) extends Expr[Int] | |
final case class EEqual(a: Expr[Int], b: Expr[Int]) extends Expr[Boolean] | |
def eval[A](e: Expr[A]): A = e match { | |
case EBool(a) => a | |
case EInt(a) => a | |
case EEqual(a, b) => eval(a) == eval(b) | |
} | |
val expr1 = EEqual(EInt(2), EInt(3)) | |
val ret = eval(expr1) | |
val ret2 = eval(EEqual(EInt(4), EInt(4))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment