First steps
Let's define the list nodes. First, let's briefly look at a sealed trait. A trait is just an interface. It may contain methods too. See http://joelabrahamsson.com/learning-scala-part-seven-traits/
for more information.
The sealed keyword allows the compiler to do exhaustive checking. For example, here is an REPL session to see this feature in action:
scala> trait A
defined trait A
scala> case class B() extends A
defined class B
scala> case class C() extends A
defined class C
scala> def m(a: A) = a match {
| case B() => println("It is a B")
| }
Note the definition of the m(A) method. It just handles objects of this type: B.
What happens when we call the m(C()) method? We get a match error:
scala> m(C()) scala.MatchError:..
The sealed keyword helps in this case. Just change the definition of trait A as follows:
sealed trait A
You also need to redefine the B and C case classes...