val/varUnit): Type notationdef fun(params) = expr (Don't forget the =)List[T], head, tail, ::, isEmpty,
NilWarm-up exercise: What does this function do?
def mystery(lst : List[Int], n : Int) : List[Int] = if (lst.isEmpty) n :: Nil else lst.head :: mystery(lst.tail, n)
case class ClassName(field1 : Type1, field2 : Type2, ...) extends Superclass
class Tree case class Leaf(value : Int) extends Tree case class Node(left : Tree, right : Tree) extends Tree

ClassName(arg1, arg2, ...)Node(Node(Leaf(3), Leaf(2)), Leaf(7))
selectorExpr match {
case pattern1 => expr1
...
case patternn => exprn
}
tree match {
case Node(l, r) => expr1
case Leaf(v) => expr2
}
case n@Node(l, r)
case _
class Poly
case class Const(value: Double) extends Poly
case class X extends Poly
case class Sum(left: Poly, right: Poly) extends Poly
case class Prod(left: Poly, right: Poly) extends Poly
def deriv(p: Poly): Poly = p match {
case Const(v) => Const(0)
case X() => Const(1)
case Sum(f, g) => Sum(deriv(f), deriv(g))
case Prod(f, g) => Sum(Prod(f, deriv(g)), Prod(deriv(f), g))
}
deriv(Sum(Prod(X(),X()),X()))
res: Poly = Sum(Sum(Prod(X(),Const(1.0)),Prod(Const(1.0),X())),Const(1.0))
eval function is not useful for our purpose. It evaluates a
lambda expression from an “environment”—a map of free
variables to values. We want to reduce the lambda expression, not plug in
values for free variables.