x = 4). Słowo kluczowe val pozwala zdefiniować wartości, które nie podlegają zmianom (ang. immutable). Również takie konstrukcje jak if else, match/case, czy for/yield są wyrażeniami.
Scala ma „klasy przypadków” oraz wbudowane wsparcie dla dopasowywania wzorców. Pozwala to korzystać z algebraicznych typów danych, używanych w wielu funkcyjnych językach programowania. Język ten w umiejętny sposób łączy cechy języka obiektowego (klasy, dziedziczenie, polimorfizm, ...) z cechami języka funkcjonalnego (funkcje wyższego rzędu, liczne kolekcje niemodyfikowalne, currying, dopasowanie wzorców, ...). Oba paradygmaty są równie mocno wspierane.
Rekurencja ogonowa nie jest całkowicie obsługiwana, ponieważ maszyna wirtualna Javy nie udostępnia takiej możliwości. W prostych przypadkach kompilator Scali może optymalizować rekurencję ogonową do postaci pętli.
Implementacja prostego algorytmu sortującego (podobnego do quicksort) w podejściu programowania funkcyjnego może wyglądać następująco: def qsort(list : List[Int]): List[Int] = list match { case Nil => Nil case pivot :: tail => { val (smaller, rest) = tail partition (_ < pivot)