Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
12.1 foldLeft
Analog wie wir sie in der Übung erarbeitet haben, habe ich die foldLeft Methode mal abgetippt:
def foldLeft: List[Int] => ((List[Int], Int) => List[Int]) => List[Int] => List[Int] = ys => f => xs match {
case Nil => ys
case x::xs => foldLeft(f(ys, x))(f)(xs)
}
Jedoch schluckt das der Compiler nicht.
<console>:9: error: not found: value xs
Komisch, in der Übung hat es ja geklappt. Hab ich mich irgendwie vertippt?
a) noch ein xs => vor das xs match, da sonst xs nicht bekannt ist
b) xs match weglassen
Danke, beide Varianten funktionieren
Und wie kann man einer Map ein Key-Value Paar anfügen?
Ein Aufruf wie myMap.+(key, value) gibt laut API ja jedes Mal eine neue Map zurück…
Das ist so gewollt. Da wir funktional programmieren, müssen wir mit immutable Objekten arbeiten => eine Map darf nicht verändert werden.
Wenn man also ein Element einfügt, muss eine neue Map erzeugt werden. Es ist Aufgabe eben dieser Map, das möglichst effizient zu tun. Von Nachteil wäre es, wenn die Elemente der alten Map in die neue kopiert werden müssten. Aber: bei Listen z.B. arbeitet man mit dem Trick, dass die neue Liste lediglich das neue (Kopf-)Element und die alte (Rest-)Liste enthält. Hoffentlich ist das bei einer Map ebenso… Update: Hab gerade in den Scala-Sourcecode gesehen. Es ist so, allerdings sehr sehr viel komplizierter als bei einer Liste…