Skip to content

Instantly share code, notes, and snippets.

@fkautz
Last active December 18, 2015 21:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fkautz/5846210 to your computer and use it in GitHub Desktop.
Save fkautz/5846210 to your computer and use it in GitHub Desktop.
Example of compiler discovering and warning missing cases in a simple calculator. sealed abstract class Expression is required for the warning message to appear. Sealed will require all direct subclasses (but not subclasses of subclasses) to be defined within the same file.
sealed abstract class Expression
case class Add(val exp1:Expression, val exp2:Expression) extends Expression
case class Subtract(val exp1:Expression, val exp2:Expression) extends Expression
case class Multiply(val exp1:Expression, val exp2:Expression) extends Expression
case class Divide(val exp1:Expression, val exp2:Expression) extends Expression
case class Value(value:Double) extends Expression
object Calculator {
def calculate(expression:Expression):Double = {
expression match {
case Value(value) => value
case Add(exp1, exp2) => calculate(exp1) + calculate(exp2)
case Subtract(exp1, exp2) => calculate(exp1) - calculate(exp2)
case Multiply(exp1, exp2) => calculate(exp1) * calculate(exp2)
// case Divide(exp1, exp2) => calculate(exp1) / calculate(exp2)
}
}
}
object ScalaWithStyle {
def main(args:Array[String]) {
val result = Calculator.calculate(
Multiply(
Add(Value(1), Value(2)),
Add(Value(3), Value(4))))
println(result) // result is 21.0
}
}
Warning:
Description Resource Path Location Type
match may not be exhaustive. It would fail on the following input: Divide(_, _) ScalaWithStyle.scala /ScalaWithStyle/src line 11 Scala Problem
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment