scala> abstract class Subject()
defined class Subject
scala> case class History(grade: String, mark:Int) extends Subject
defined class History
scala> case class Math(grade: String, mark:Int) extends Subject
defined class Math
scala> case class Geo(grade: String, mark:Int) extends Subject
defined class Geo
scala> case class Science(grade: String, mark:Int) extends Subject
defined class Science
scala>
scala> ////////////////////////////////////////////////////////////////
scala> // Partial Function : Example... #327
scala> ////////////////////////////////////////////////////////////////
scala> val fn1: Subject => Unit = {
| // A Partial function is a sequence of 'case's
| case History(_, _) => println("History...")
| case Math(_, mark) => println("Math...")
| case Geo(_, mark) => println("Geo...")
| }
fn1: Subject => Unit = <function1>
scala>
scala> fn1(History("1st", 70))
History...
scala> fn1(Science("1st", 70))
scala.MatchError: Science(1st,70) (of class Science)
at $anonfun$1.apply(<console>:14)
at $anonfun$1.apply(<console>:14)
at .<init>(<console>:18)
scala> ////////////////////////////////////////////////////////////////
scala> // Adding isDefinedAt() for Partial Function #330
scala> ////////////////////////////////////////////////////////////////
scala> val fn1: PartialFunction[Subject, Unit] = {
| case History(_, _) => println("History...")
| case Math(_, mark) => println("Math...")
| case Geo(_, mark) => println("Geo...")
| }
fn1: PartialFunction[Subject,Unit] = <function1>
scala>
scala> fn1(History("1st", 70))
History...
scala> fn1.isDefinedAt(Science("1st", 70))
res9: Boolean = false