A Scala-ban az osztályoknak lehetnek típus paramétereik. Ezt az iterátorok segítségével mutatjuk be:
A next metódus a következő elemet adja vissza, a hasNext pedig azt, hogy van-e következő elem. Egy iterátor által visszaadott elemek típusa tetszőleges lehet. Ezt azzal fejeztük ki, hogy az iterátornak lehet egy a típus paramétere.
A foreach metódus egy eljárást alkalmaz az iterátorra:
Az append metódus lényegében összefűzi két iterátor által megadott elemek listáját:
Az outer.next és outer.hasNext kifejezések az append-ben a megfelelő metódusokat hívják, vagyis azokat melyek a tartalmazó Iterator osztályban lettek definiálva. Általában az outer prefix egy kiválasztásban azt jelenti, hogy az aktuális osztályon vagy sablonon kívül közvetlenül látható azonosítóra hivatkozunk. Ha az outer nem lenne, akkor rekurzív hívást tennénk.
A filter metódus létrehoz egy iterátort, mely az összes az eredeti iterátorban levő azon elemeket adja vissza, melyekre a p kritérium igaz:
A map metódus az eredeti iterátor összes elemére alkalmazza az f függvényt és az eredményeket helyezi egy iterátorba:
Az f függvény által visszaadott érték tetszőleges típusú lehet. Ezért a map egy polimorfikus függvény.
A zip metódus egy olyan iterátort ad vissza, mely két iterátor elemeiből álló párokat tartalmaz:
A konkrét iterátoroknak lényegében csak a next és hasNext metódusokat kell megvalósítaniuk. A legegyszerűbb iterátor az EmptyIterator:
Egy érdekesebb iterátor az arrayIterator. Ez egy tömb elemeit adja vissza:
Egy másik iterátor egy intervallum elemeit adja vissza:
Lehetőség van olyan iterátor létrehozására is, amely sohasem terminál:
Az iterátorok használhatóak a következőképpen:
Ez egy egész elemeket tartalmazó tömb összes elemét kiírja.
A fenti példában az [Int] típus argumentum redundáns, mert ezt az xs-ből a fordító ki tudja következtetni, ha az egészek tömbje. Ezért írhatjuk a következőt:
Scalaban lehetőség van egymással összefüggő típusok családjának a modellezésére. Gyakran szükségünk lehet rá, hogy ne csak osztályok típusparamétereire tehessünk megszorításokat, hanem esetleg az egyes osztályok típusparaméterei közötti összefüggést is leírhassuk. Ez azt jelenti, hogy osztályok egy csoportját szeretnénk együttesen kezelni egy magasabb absztrakciós szinten. Ezen a magas szinten szeretnénk megadni bizonyos kapcsolataikat, majd egy alacsonyabb szinten lehetőséget kapni arra, hogy megadjuk a kombinációit azoknak az osztályokat, amik között az őseik közötti kapcsolatot megengedjük. Ezzel több osztály esetén azt biztosítjuk, hogy az ősosztályoknak csak az általunk megadott kombinációkban állhatnak a leszármazottjai kapcsolatban egymással. A fenti nyelvi elemre például akkor lehet szükségünk, ha egy design patternt szeretnénk könyvtári eszközökkel támogatni. A jobb érthetőség miatt a továbbiakban egy példán mutatom be az előbb leírtakat. Képzeljük el, hogy az observer design patternt szeretnénk könyvtári eszközökkel támogatni. Azokban a nyelvekben amelyekben nincs family polimorfizmus, nem lehetséges a könyvtári támogatás, mert nélküle nem tudjuk garantálni, hogy ha több leszármazottja van a subject és az observer osztályoknak a programunkban (a magasabb absztrakciós szinten megadott ősosztályokból származtatva), akkor csak a megfelelő subjectből származtatott osztály egy objektumához tudjuk hozzácsatolni egy megfelelő observer osztályból származtatott osztály egy objektumát. Scalaban az observer design pattern kódja a következőképpen nézne ki:
A SubjectObserver absztrakt osztály két tagosztályt tartalmaz. A Subject absztrakt osztályban lévő subscribe metódus annyit csinál, hogy regisztrál egy observert a szükség esetén értesítendő observerekhez. Az előbb említett értesítést a publish metódus végzi az Observer osztályban definiált notify metóduson keresztül. Általában a publish metódus akkor hívandó meg, amikor valamilyen változás történik az objektum állapotában. A valóságban egy subject egyszerre több observert is értesíthet és egy observer egyszerre több subjectet is figyelhet, ezért szükséges a Subject osztály subscribe metódusának szignatúrájában az observerre és az Observer osztály notify metódusában a subjectre hivatkozni, azoban lehetőséget kell hagyni arra, hogy ezeknek a paramétereknek a típusát a későbbiekben meghatározhassuk. Ezért van szükség az S és az O típus definíciójára az első két sorban. Itt annyi kikötést teszünk, hogy amikor majd ezeket a típusokat konkrétan megadjuk az S-nek a Subject gyerekének, míg O-nak az Observer gyerekének kell lennie. A Subject osztály definíciójában a requires kulcsszó azt fejezi ki, hogy az osztályt példányosítani csak a SubjectObserverrel együtt lehet, az S megadása után. Ennek oka, hogy amikor a publish metódusban az observer notify metódusa meghívásra kerül, a fordítónak el kell tudnia dönteni, hogy a this megfelel-e az S típusnak. Miután elkészítettük a fenti osztályt, lehetőségünk van alkalmazás specifikus subject-observer osztályok létrehozására:
A példában a subject a Sensor és az observer a Display osztályok lettek. A subjectnek és az observernek megfelelő osztályokat mindig kötelező megadni. Mivel a Sensor egy absztrakt osztály, a fenti kód használatához definiálnunk kell egy konkrét osztályt ami a Sensor altípusa.
Itt megjelenik, hogy az S és az O típusnak a Sensor és a Display altípusának kell lennie. A fenti kód használata a következő képen történhet:
Amit nyertünk a family polimorfizmussal így már pontosan látszik. Új subject-observer osztályok bevezetése esetén a SubjectObserver osztályban definiált mechanizmusokat nem kell újraimplementálnunk, ráadásul a nem egymáshoz illő subject-observer párokat nem kapcsolhatjuk össze, mivel amennyiben mégis véletlenül megpróbálnánk összekapcsolni őket, a fordító még fordítási időben képes lesz jelezni a típushibát, ellentétben azokkal a nyelvekkel ahol nincsen family polimorfizmus, mivel ott egy hasonló konstrukció estén hiányoznának a fordítóprogram számára a jelenlegi példában az S-ben és az O-ban megadott típusok.
Van, amikor egy függvény több értékkel szeretne visszatérni. Például a következő függvény esetében:
A függvény két egész szám osztásakor keletkező hányadost és maradékot szeretné visszaadni. Ehhez definiálja a TwoInts case osztályt. Mivel ezt minden alkalommal megtenni rendkívül körülményes, azért hozták létre a nyelvben a Tuple típust. Az alábbi példa mutatja, hogy használhattuk volna a Tuple2-őt az eredeti metódusban a TwoInts helyett:
A Tuple2 definíciója a következő képen nézne ki, ha nekünk kellene implementálni:
A nyelv specifikációja szerint 22-ig van generikus Tuple case osztály definiálva, azaz akár 22 visszatérési értékkel rendelkező függvényt is írhatunk. Miután tudjuk, hogyan kell több értékkel visszatérni, már csak az a kérdés maradt, hogy nyerhetjük ki a Tuple-ből az értékeket. Erre egy lehetséges mód, a változó neve után a „._i”-vel történő elérés, ahol i helyére azt a számot kell írni, ahányadik visszatérési paramétert szeretnénk elérni. Például:
A példában a függvény által első visszaadott értékre az „xy._1”-el, míg a második visszaadott értékre „xy._2”-vel hivatkozhatunk.