Posts mit dem Label scala werden angezeigt. Alle Posts anzeigen
Posts mit dem Label scala werden angezeigt. Alle Posts anzeigen

Montag, 28. Februar 2011

Was ist eine funktionale Programmiersprache ohne Listen?


Oder anders ausgedrückt: wie könnte man sich einer funktionalen Sprache besser nähern, als über Listen? Auf www.simplyscala.com habe ich die folgenden Beispiele durchgespielt.

Der graue Text sind meine Eingaben. Der grüne Text sind die Ausgaben des Interpreters.

var la = List(1,4,6,9,10,20,11,3)
la: List[Int] = List(1, 4, 6, 9, 10, 20, 11, 3)

Mit List(x, y, ...) kann ich offenbar eine Liste von Zahlen definieren. Und la=... weist das neue Objekt der Variable la zu.

var lb = la ++ List(-3,-2,-8)
lb: List[Int] = List(1, 4, 6, 9, 10, 20, 11, 3, -3, -2, -8)

Mittels ++ kann man also Listen aneinander hängen.

var lc = lb.sorted
lc: List[Int] = List(-8, -3, -2, 1, 3, 4, 6, 9, 10, 11, 20)

Die Funktion sorted ist eine Methode der Liste und liefert, nicht unerwartet, eine sortierte Variante.

var ld = lc.filter( _ < 0)
ld: List[Int] = List(-8, -3, -2) 

Aha, filtern kann man also auch. Der Ausdruck zwischen den runden Klammern ist das Prädikat, anhand dessen die Liste gefiltert wird. Es wird auf jedes Element der Liste angewendet. Wenn es zu true evaluiert, dann wird das Element (dargestellt durch ein "_") in die neue Liste aufgenommen, andernfalls wird es verworfen.
Vermutlich kann ich dafür auch eine Funktion verwenden?!

def isNeg(v:Int) = v < 0
isNeg: (v: Int)Boolean 
 
Wie man sieht, kann man mit def ... = ... in Scala eine Funktion definieren.
Verwenden wir die doch gleich mal.

var le = lc.filter(isNeg(_))
le: List[Int] = List(-8, -3, -2) 
 
Ok. Das hat geklappt.
Ob man auch zwei Listen auf einmal erzeugen kann?

var (low, hi) = lc.partition(isNeg(_))
low: List[Int] = List(-8, -3, -2)
hi: List[Int] = List(1, 3, 4, 6, 9, 10, 11, 20)

Die Methode partition zerlegt die Liste anhand des Prädikats in zwei Listen ("Die Guten ins Töpfchen, die schlechten ins ..."). Der Rückgabewert ist ein Tuple. Hier habe ich es gleich wieder in seine Bestandteile zerlegt und den beiden Variablen zugewiesen.

Zu guter Letzt' wollen wir doch mal eine Funktion in Action sehen...

def f(x:Int) = 2*x+3
f: (x: Int)Int

Das kenn' ich noch aus der Schule: "F von x ist 2 mal x plus 3" :-)
Und nun mal anwenden lassen...

var y = List(-3,-2,-1,-0,1,2,3).map( f)
y: List[Int] = List(-3, -1, 1, 3, 5, 7, 9)

Die Methode map wendet die angegebene Funktion auf jedes Listenelement an und stopft das Ergebnis in die Ergebnisliste.

Das war's für heute.

M.