Following Martin Odersky’s course on coursera – Functional Programming with Scala and I’m on Week 4 where we’re learning about Types and Pattern Matching. In the video lecture, this is the representation of a Natural Number:
abstract class Nat {
def isZero: Boolean
def predecessor: Nat
def successor: Nat = new Succ(this)
def + (that: Nat): Nat
def  (that: Nat): Nat = if (that.isZero) this else (predecessor  that.predecessor)
}
object Zero extends Nat { // for a zero
def isZero = true
def predecessor = throw new NoSuchElementException
def + (that: Nat) = that
}
class Succ(n: Nat) extends Nat { // for nonzero (positive) numbers
def isZero = false
def predecessor = n
def + (that: Nat) = n + that.successor
}
My questions are:

when I create a
val two = new Succ(2)
why would I set thetwo.predecessor = 2
when2
‘s predecessor is actually1
? 
When I call
two + new Succ(4)
internally why am I evaluating2 + successor of 4
and notnew Succ(2 + 4)
? 
In the main abstract class
Nat
, thesuccessor
field is intialised with aSucc
object. Wouldn’t the value ofsuccessor
be the same as the object that was just constructed?
I’m just …unable to grasp the relationship/implementation here …
PS – I do have a Java background if that helps