Blog Post
Scala School september 2015 Meetups
Today I was at the at the New York scala school, we had some fun time implementing linked list methods. The idea was to give some introductions to some of the scala concepts.
The slides of the presentation are available here.
What I mainly got out of this presentation is the existence of sealed traits which are traits that cannot be extended outside of the file. As a result the compiler is able to get all the subtypes and give you a lot of insights at compilation time.
From the presentation was given this example:
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
val x: Answer = Yes
x match {
case No => println("No")
}
Will give the compiler warning:
<console>:14: warning: match may not be exhaustive.
It would fail on the following input: Yes
x match {
^
scala.MatchError: Yes (of class Yes$)
Finally, we implemented some linked list methods. Here is the skeleton of the project.
case object MNil extends MList
case class MCons(head: Int, tail: MList) extends MList
sealed trait MList {
def length: Int = this match {
case MNil => 0
case MCons(h, t) => 1 + t.length
}
def sum: Int = ???
def map(f: Int => Int): MList = ???
def filter(f: Int => Boolean): MList = ???
def append(e: Int): MList = ???
def reverse: MList = ???
}
val myList: MList = MCons(1, MCons(2, MCons(3, MCons(4, MNil))))
myList.length //4
// Provide implementations for the following methods...
myList.sum // res1: Int = 10
myList.map(_ + 1) // res2: MList = MCons(2,MCons(3,MCons(4,MCons(5,MNil))))
myList.filter(_ % 2 == 0) // res3: MList = MCons(1,MCons(3,MNil))
myList.append(5) // MCons(1,MCons(2,MCons(3,MCons(4,MCons(5,MNil)))))
myList.reverse // MCons(4,MCons(3,MCons(2,MCons(1,MNil))))