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.
Aufgabe 12.4: Teilersummen
[s]Moinsen, hab hier ne Frage zur c):
versteht hier jemand den Satz [quote]
Verwenden Sie unbedingt foldLeft{B}(z: B)(f: (B, A) => B): B aus List{A} .
[/quote] ?
Hat da grad jemand nen bsp.Aufruf parat wie dieses foldLeft für konkrete Typen aussehn könnte? Versteh deren generic-definition grad nicht irgendwie…[/s]
edit: Denke ich habs nun doch kapiert. Darf ich mir hier eine eigene Vergleichsfunktion schreiben die ich foldLeft mitgebe?
Ebenfalls erledigt, kann man aber ist nicht zwingend notwendig. Falls jemand Probleme mit der Verwendung von foldLeft hat, siehe API und ein Paar Beispiele.
Bitte WAS?!? Es gibt noch eine Aufgabe? Mit Abgabe bis zum 18.?!? Das sind zwei Werktage vor der Prüfung!
Warum ist die Evaluation immer Vorbei, wenn einem sowas auffällt? So ein Scheiß.
öhm ja, gibts. Schuld sind afaik die ganzen Feiertage etc.
Ich fand das Blatt, vor allem die Klausuraufgabe, aber ziemlich easy und seh’s als extra Vorbereitung für die Klausur.
Wurde das in deiner Übung nicht bekannt gegeben?
Ja. Das Blatt ist wirklich fair und relativ schnell zu bearbeiten.
Also eigentlich kein Grund, erbost zu sein. Für die Klausur müsste man es eh lernen.
Außerdem wären wir sonst nicht auf unsere möglichen 120 Bonuspunkte gekommen.
Na gut, passt zwar nicht gerade in meine Planungen, aber wenn’s nicht so viel ist werd ich das schon dazwischen schieben können.
Die Angabe “def fs: Int => Int = construct(facs)(sum)” ist mir etwas schleierhaft. Fehlt hier nicht noch ein Paramter für n? Bzw. müsste dieser nicht sonst zumindest bei der construct(a)(b) mit eingefügt werden?
Genau das gleiche habe ich mich auch schon gefragt …
also bei mir läuft das und ich hab das ungefähr so:
mein construct bildet eine funct => funct => Int => Int ab
fs ist ja Int => Int = construct(facs)(sum)
=> wenn man fs aufruft wird das Int aus fs verwendet und mit construct aufgerufen
=> das dritte int aus construct ist das welches von fs kommt und das vierte ist das Int auf das abgebildet wird
def fs: Int => Int = construct(facs)(sum)
Das ist eine Kurzschreibweise ohne den Parameter explizit zu benennen.
Wenn es dir leichter fällt, kannst du auch einfach schreiben:
def fs: Int => Int = n => construct(facs)(sum)(n)
Du brauchst diesen zusätzlichen Parameter jedoch nicht, weil [m]construct(facs)(sum)[/m] eine Funktion zurückliefert, die ein Int erwartet und ein Int zurückgibt. Dies entspricht ja genau dem Typ der Funktion fs. Rufst du nun z.B. [m]fs(10)[/m] auf, wird einfach [m]onstruct(facs)(sum)(10)[/m] ausgeführt.
Und wenn es dir immer noch zu viel Schreibaufwand ist, kannst du auch noch mehr kürzen und Scala die Typen selbst herausfinden lassen ;):
def fs = construct(facs)(sum)
Mal noch 'ne doofe Frage: Ist das Testprogramm irgendwie von Relevanz? Ich habe keine Methode factors(n), aber die ist ja auch in der Angabe nicht verlangt…
def facs: Int => List[Int] = { n => for(i <- List.range(1,n); if n % i == 0) yield i }
def sum: List[Int] => Int = { l => l.fold(0)((z,i) => z + i) }