Aufgabe 11.7

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 11.7
Hallo zusammen,

ich habe ein Problem mit der Empfohlenen generischen Methode List.ZipAll:
mein Code: .... case (as, bs) => { val as2 = as.zipAll[Bit](bs, Bit.Low, Bit.Low) ....
liefert:

error: wrong number of type parameters for method zipAll: [B, A1 >: EndianSkeleton.Bit.Bit, That](that: scala.collection.GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: scala.collection.generic.CanBuildFrom[List[EndianSkeleton.Bit.Bit],(A1, B),That])That
                        val as2 = as.zipAll[Bit](bs, Bit.Low, Bit.Low)
                                           ^

Ich habe nach langer suche keine Antwort gefunden, was da jetzt genau falsch ist.

Davor hatte ich die Methode ohne [Bit], dann kriege ich die Fehlermeldung (in einer späteren Zeile), dass die Liste as2 vom Typ List[(Bit, Value)] ist (was mir logisch erschien, daher dann die generische Variante).

Hat jemand eine Idee?

Vielen Dank schonmal!


Laut Fehlermeldung benötigt zipAll drei Typparameter, es ist aber nur einer angegeben. Ich würde die Typparameter weglassen, da der Compiler diese automatisch u.a. unter Verwendung einer implicit-Regel herleitet.

Die spätere Fehlermeldung dürfte daher rühren, dass import Bit._ nicht verwendet wurde (siehe auch Thread zur Aufgabe 11.6: https://fsi.informatik.uni-erlangen.de/forum/thread/10530-Aufgabe-11-6). In einer Enumeration wird als Teil der Implementierung ein Typ-Alias der Form type Bit = Value definiert. Durch diesen ist der Typ Bit mit dem Enumeration-spezifischen Typ Value gleichzusetzen und wird vom Compiler auch so erkannt.

Also nochmals: Bei Verwendung von Enumerations einfach immer import EnumerationName._ verwenden, auch wenn man es nicht versteht, nicht mag, störrisch ist, oder warum auch immer.


vielen Dank für die Schnelle Antwort.
Mit import EndianSkeleton.Bit._ funktioniert es jetzt. Ich hatte davor darauf verzichtet und nur ein import AdderSkeleton._ da ja im AdderSkeleton schon Bit importiert wird. Reicht dann wohl nicht, auch wenn ich nicht verstanden habe warum.
Jetzt funktioniert es auf jeden Fall.


Es sollte auch mit import AdderSkeleton.Bit._ funktionieren.

In Scala wirken import-Anweisungen nur im aktuellen Namensraum. In Java ist es so, dass man import zu Beginn einer Datei notiert. Die Imports gelten dann lediglich für diese Datei. In Scala ist es genau so, nur dass man import nahezu überall schreiben kann. Notiert man es innerhalb einer Klasse oder eines objects, dann gilt es nur darin. Man kann es auch innerhalb einer Funktion schreiben, dann wirkt es aber auch nur darin. Wie in Java wirken imports nur nach innen, nie nach außen.

Anmerkung: Eigentlich ist import irreführend, da nichts importiert wird. Es wird lediglich etwas im aktuellen Namensraum bekannt gegeben.

Aufgabe 11.7 c)
Warum funktioniert folgender Abgleich nicht:

case x => (Nil,Nil) => List()

Komm da einfach nicht weiter…


ich denke du willst eher etwas in der art:

x match {
case (Nil,Nil) => List()
}

oder wenn x eine liste ist:

x match {
case (Nil,Nil)::xs => List()
}

Ja das funktioniert ja auch, aber nicht wenn ich zusätzlich noch eine Funktion (x) übergeben muss, wie in der Aufgabe ja gefordert ist…


So sollte es klappen:
def bla: … => … => … = x => {
case (Nil, Nil) => Nil
}

Frage
Hallo,
bei den Beispielen in Aufg. 11.7 c) ist nicht der Fall sum(ha)(Nil,List(High)).
Sollen wir dann List() zurückgeben?
Dies würde aber bedeuten, dass decode(sum(ha)(encode(0),encode(1))) == 0 (2. Tipp von 11.7 c)) gilt, da encodeBigEndian(encodeLittleEndian)(0) == List() sein soll (gemäß dem Beispiel in Aufgabenteil b)).
Gebe zu, dass dies ein Spezial-Spezial-Fall ist.
Aus meiner Sicht würde es trotzdem Sinn machen, wenn sum(ha)(Nil,List(High)) die leere Liste zurückliefert, da man schlecht eine Zahl zu keiner Zahl addieren kann.
Danke für die Antwort


ja aber 0 und 1 kann man addieren :slight_smile:
Die Beispiel wo nur Low und leere Liste addiert werden würden auch erst mal List(Low) liefern. Da wir aber Big Endian zurück liefern sollen wir das auf List() getrimmt.

List() == Nil


Es soll gelten: Nil == List() entspricht List(Low) entspricht 0

Sonst ist das System so wie du schon festgestellt hast nicht stimmig. Wenn an einem Eingang eines Logikbausteins kein Signal (also keine Spannung) anliegt, so hat er den Zustand Low. Wenn an einem Ausgang eines Logikbausteine kein Signal (also keine Spannung) herauskommt, so ist das Ausgangssignal Low. Dies ist dann stimmig.


danke