Scala
Scala
Programming
Language
Why a new language?
Goal was to create a language with better
support for component software
Two hypotheses:
Programming language for component
software should be scalable
The same concepts describe small and large
parts
Rather than adding lots of primitives, focus is
on abstraction, composition, and decomposition
Language that unifies OOP and functional
programming can provide scalable support
for components
Adoption is key for testing this hypothesis
Scala interoperates with Java and .NET
Features of Scala
Scala is both functional and object-oriented
every value is an object
every function is a value--including methods
in Java 1.5:
Pair p = new Pair<Integer, String>(1, "Scala");
in Scala:
val p = new MyPair(1, "scala");
More features
Supports lightweight syntax for
anonymous functions, higher-order
functions, nested functions, currying
ML-style pattern matching
Integration with XML
can write XML directly in Scala program
can convert XML DTD into Scala class
definitions
Support for regular expression patterns
Other features
Allows defining new control
structures without using macros,
and while maintaining static typing
Any function can be used as an
infix or postfix operator
Can define methods named +, <=
or ::
Automatic Closure
Construction
Allows programmers to make their own
control structures
Can tag the parameters of methods with
the modifier def.
When method is called, the actual def
parameters are not evaluated and a no-
argument function is passed
While loop example
object TargetTest1 with Application {
def loopWhile(def cond: Boolean)(def body: Unit): Unit =
if (cond) {
body; Define loopWhile method
loopWhile(cond)(body);
}
var i = 10;
loopWhile (i > 0) { Use it with nice syntax
Console.println(i);
i=i-1
}
}
Scala class hierarchy
Scala object system
Class-based
Single inheritance
Can define singleton objects easily
Subtyping is nominal
Traits, compound types, and views allow
for more flexibility
Classes and Objects
trait Nat;
trait Set {
def include(x: int): Set;
def contains(x: int): boolean
}
trait GenList[+T] {
def isEmpty: boolean;
def head: T;
def tail: GenList[T]
}
object Empty extends GenList[All] {
def isEmpty: boolean = true;
def head: All = throw new Error("Empty.head");
def tail: List[All] = throw new Error("Empty.tail");
}
class Cons[+T](x: T, xs: GenList[T]) extends GenList[T] {
def isEmpty: boolean = false;
def head: T = x;
def tail: GenList[T] = xs
}
Variance Annotations
Can also have contravariant type
parameters
Useful for an object that can only be written to
Scala checks that variance annotations are
sound
covariant positions: immutable field types,
method results
contravariant: method argument types
Type system ensures that covariant
parameters are only used covariant positions
(similar for contravariant)
Types as members
abstract class AbsCell {
type T;
val init: T;
private var value: T = init;
def get: T = value;
def set(x: T): unit = { value = x }
}