Scala im CIP

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 im CIP
Hallo,

bei der Bearbeitung der Aufgabe 10.9 hat mich Scala im CIP ja fast zur Verzweiflung gebracht. Konkret geht es um den Hinweis auf die Methode [m]isValidInt[/m]. Hier die Scala-REPL-Session aus dem CIP:

Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> scala.math.sqrt(4)
res0: Double = 2.0

scala> scala.math.sqrt(4).isValidInt
res1: Boolean = false

scala> (4.0).isValidInt
res2: Boolean = false

Und hier bei mir lokal:

Welcome to Scala version 2.10.0-20121205-235900-18481cef9b (OpenJDK 64-Bit Server VM, Java 1.7.0_40).
Type in expressions to have them evaluated.
Type :help for more information.

scala> scala.math.sqrt(4)
res0: Double = 2.0

scala> scala.math.sqrt(4).isValidInt
res1: Boolean = true

scala> (4.0).isValidInt
res2: Boolean = true

Sieht leicht anders aus, oder? Deswegen folgende Frage: Wie sieht es hier eigentlich in PFP aus? Welche Scala-Version sollen/dürfen wir verwenden und ist ähnlich wie in AuD und SP der CIP das Refernzsystem? Falls ja, dann ist der Hinweis auf dem Blatt ja irgendwie witzlos. Oder gilt hier etwas anderes?

[size=4]Erwähnte ich bereits, dass mir Scala irgendwie nicht gefällt?[/size]


Anscheinend gab es einen Bug-Fix für genau diese Methode:

von

=> Scala 2.9.2: def isValidInt = isWhole && (toLong == toInt)
zu

=> Scala 2.10.2: override def isValidInt = self.toInt.toDouble == self

Die Vorlesung beruht gegenwärtig auf Scala 2.10 und ich bin bemüht, die Folien der rasanten Entwicklung laufend anzupassen.
Selbst wenn der CIP als Referenz-System dienen sollte, so kann man das im obigen Fall (wo ein Bug in der API vorlag) wohl kaum wörtlich nehmen…

Wenn ich nicht irre, dann galt das damalsTM entsprechend auch für Java in AuD… :wink: oder?
Übung macht den Meister - und spätestens nach der letzten Vorlesung wirst du auch die Eleganz und den Sinn erkennen (hoffe ich), sobald die Parallelisierung erklärt wird…


Das heißt im konkreten Fall? [m]isValidInt[/m] verwenden und geht halt im CIP kaputt oder lieber toInt.toDouble verwenden und vergleichen? Ein Hinweis auf dem Aufgabenblatt wäre evtl. auch nicht schlecht, da mich das gestern doch einige Zeit gekostet hat und mir auch erst Zuhause aufgefallen ist, dass es an der älteren Scala-Version im CIP lag.

Naja, Java mochte ich noch nie so wirklich, auch vor AuD. Aber Scala, ich weiß ja nicht, ich hoffe wirklich, dass es besser wird.

Es sind einfach so Dinge wie dass z.B.

def f[T]: ((T, T)) => (T, T) = (a, b) => (b, a)

nicht funktioniert, aber

def f[T]: ((T, T)) => (T, T) = {
  case (a, b) => (b, a)
}

hingegen schon. Und dass man das Tupel an der einen Stelle doppelt klammern muss, ist auch interessant. Es kann natürlich auch sein, dass ich Dinge furchbar falsch tue, aber dann bitte ich um eine Erklärung.


2.10 ist im CIP installiert.

Einfach:
addpackage scala-2.10


Das Thema Tupel vs. Parameterliste wurde bereits in Scala-Mailinglisten diskutiert und es wird sich wohl nicht so schnell was ändern: https://groups.google.com/forum/#!topic/scala-debate/GJCDsQqX2EY


Was war eigentlich die Motvation Haskell nicht mehr zu verwenden?


Vermutlich die Möglichkeit der Objektorientierung und Parallelisierung.


Parallelisierung kann Haskell auch. Und Objektorientierung macht ordentliche Parallelisierung erstmal eher schwierig.

1 Like

Nochmals: Als Ersatz für isValidInt in Scala 2.9 kann man folgende selbst definierte Funktion verwenden:

def isValidInt: Double => Boolean = d => d.toInt.toDouble == d