Pattern matching Explained
This is an explanation to the previous blog 1  relating to the Scala Matching. Most of the thoughts referring to the book "Functional Programming in Scala" 2 .   For example consider the following Algebraic Data Type MList:   // Singly linked lists sealed trait MList[+A] case object MNil extends MList[Nothing] case class Cons[+A](head:A, tail: MList[A]) extends MList[A]  object MList{ //companion object   def sum (ints: MList[Int]):Int =     ints match {       case MNil => 0       case Cons(x,xs) => x + sum(xs)     }    def apply[A](as: A*): MList[A] =     if (as.isEmpty) MNil else Cons(as.head, apply(as.tail: _*))    def append[A](fs:MList[A], ss:MList[A]): MList[A] =     fs match {       case MNil => ss       case Cons(h,t) => Cons(h,append(t, ss))     }    //curried way   def dropWhile[A](l:MList[A])( f:A => Boolean): MList[A] =     l match {       case Cons(h,t) if f(h) => dropWhile(t)(f)       case _ => l     } }  val x : MList[Int] = MList() val y :...