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.
Scala Syntax, Verwirrung
Servus,
ich weiss ja nicht ob ich irgendwas in der Vorlesung nicht mitbekommen hab, aber ich bin jetzt etwas verwirrt.
In der Vorlesung und in der Übung werden die Funktionsparameter wie beispielsweise hier:
def abs: Int => Int =
n => if (n >= 0) n else -n
mit “Int => Int” definiert.
Jetz schau ich gerade das die ScalaTutorial.pdf auf der offiziellen Scala-Hompage durch und da soll das dann eher so aussehen:
def abs(n: Int) {
…
}
Wo ist da der Unterschied? Und wieso finde ich nirgends etwas über die Syntax in der Vorlesung?
Grüße.
Der Unterschied ist,
- dass das erste eine Methode “abs” ist, die ein Funktionsobjekt vom Typ Int => Int zurückliefert,
- und das zweite eine Methode “abs” mit Methodenparametern definiert.
Dies wird z.B. auch hier nochmals erläutert: http://www.artima.com/pins1ed/functions-and-closures.html
Und wer es noch genauer wissen will, es gibt ein grundlegendes Scala-Paper: http://www.scala-lang.org/docu/files/ScalaOverview.pdf#
Wir haben uns in der Vorlesung für die erste Variante entschieden, da es in der funktionalen Programmierung hauptsächlich um Funktionen (und Funktionsobjekte) geht und nicht um Methoden (wie z.B. in Java).
Man könnte eine Funktion auch mit “val” definieren, z.B. “val f: Int => Int = …”. Das ist dann ein Attribut mit einem Funktionsobjekt vom Typ Int => Int bzw. Function1[Int, Int]. Dies hat den Nachteil, dass val keine Typparameter entgegennehmen kann, z.B. “def f[T]: T => T = …”.
In Scala kann man überall dort, wo eine Funktion erwartet wird auch eine Methode mit kompatibler Signatur angeben. Das würde, solange die Seiteneffektfreiheit beachtet wird in Übungsblättern und Klausur keinen Punktabzug geben.
Aber um alles zu vereinfachen: für PfP verwenden wir in Vorlesung, Übungen und Klausur nur die erstgenannte Syntax: “def f: Int => Int = …”.
Aufgabe 10.8 Pascalsche Dreieck
Mal eine Frage zu dieser Aufgabe:
Wie kann ich denn in einer Liste auf die Werte innerhalb eines Tupels zugreifen, also wenn ich z.B. bei der Liste:
List((1,2,3),(4,5,6))
auf die 2 im ersten Tupel zugreifen will und evtl. verändern will?
Glaub verändern kannst die nicht aber zugreifen kannst mit (a,b,c)::xs
Zugriff: List((1,2,3),(4,5,6)) (0)._2
„(0)“ entspricht einem „get(0)“ für Listen, was den Eintrag an Index 0 in der Liste zurückgibt.
„._2“ entspricht einem „get(1)“ für Tupeln, was den zweiten Tupel-Eintrag zurückgibt.
Ändern ist bei Immutable Collections nicht möglich, aber man kann eine entsprechend veränderte Kopie erhalten:
val x = List((1,2,3),(4,5,6))
val y = x.updated(0, (x(0)._1, 4711, x(0)._3))
=> Besser/eleganter geht sowas, indem man die Liste rekursiv oder mit for-comprehension durchläuft.
Ja mit Rekursion hat es jetzt geklappt, trotzdem Danke!