Seite 2 von 2

Re: Sechste Hausübung online

Verfasst: 3. Jun 2011 16:22
von sewe
Da die Frage aufkam, warum fold sich anders bzgl. Laziness verhält als nub, d.h., nicht bereits Teilergebnisse liefert: das hängt ganz von der als Operator verwendeten Liste ab. Im Beispiel, das in der Übung betrachtet wurde, ist das allerdings so; die (duplikatfreie) Ergebnisliste steht erst am Schluss der Auswertung "am Stück" zur Verfügung.

Als vereinfachtes Bespiel (habe (:) statt (++) benutzt, da es auf die Reihenfolge der Element im Resultat nicht wirklich ankommt) kann folgender Ausdruck dienen:

Code: Alles auswählen

foldl (\as b -> if b `elem` as then as else b:as) [] [1, 2, 1]
Dieser expandiert (unter freier Interpretation des Backtick-Operators) zu:

Code: Alles auswählen

((([] `\as b -> if b `elem` as then as else b:as` 1)
      `\as' b' -> if b' `elem` as' then as' else b':as'` 2)
      `\as'' b'' -> if b'' `elem` as'' then as'' else b'':as''` 1)
Die Evaluation wird nun gemäß der Klammerung zuerst in der untersten Zeile erzwungen: b'' ist offensichtlich 1 aber über den Wert von as'' kann man noch nichts sagen; dazu muss erst der Teilausdruck in den Zeilen 1-2 zumindest partiell ausgewertet werden. Zumindest partiell deshalb, weil b'' `elem` as'' (wenn as'' nicht leer ist) frühestens nach dem ersten Element mit einem Treffer abbrechen kann. Hier wiederholt sich das Spiel und der Teilausdruck in Zeile 1 wird ausgewertet (zu [1]).

Wenn man nun bedenkt, dass alle Listenelemente von der Konsole stammen, ist klar, dass Fold (ob foldl oder foldr ist hier egal) hier kein Ergebnis liefern kann, bevor nicht die gesamte Eingabe getätigt wurde, d.h., die gesamte Liste bekannt ist.

Hoffe, das bringt etwas Licht ins Dunkel.

Re: Sechste Hausübung online

Verfasst: 14. Jun 2011 20:49
von Andreas T.
Bei uns fehlt noch die Bewertung von Übung 6. Soll das so sein? ;-)

Re: Sechste Hausübung online

Verfasst: 15. Jun 2011 13:12
von sewe
Andreas T. hat geschrieben:Bei uns fehlt noch die Bewertung von Übung 6. Soll das so sein? ;-)
Soll nicht. Ist aber so. ;-)

War leider bis gestern krank; hole das heute nach.

Re: Sechste Hausübung online

Verfasst: 16. Jun 2011 15:46
von sewe
Punkte sind jetzt im SVN.

Re: Sechste Hausübung online

Verfasst: 16. Jun 2011 16:00
von yourmaninamsterdam
Ich möchte zu Protokoll geben, dass ich es -- gerade bei der (mangelnden) Klarheit der Aufgabenstellung, für nicht angemessen halte, 3 Punkte für das interaktive Verhalten abzuziehen, das ich hier vorher auch noch als korrekt bestätigt bekommen habe.
sewe hat geschrieben:Es ist in der Aufgabenstellung (wie Sie ganz richtig vermutet haben), von Variante 1 die Rede.
yourmaninamsterdam hat geschrieben: Variante 1 (es werden von einer Eingabe nur Wörter ausgegeben, die nicht vorher schonmal gesehen wurden)

Code: Alles auswählen

*Lab8 System.IO> printWords
test me plz

test
me
plz
test me again

again
test me more

more
^CInterrupted.
Wie man hier sieht, beendet eine Leerzeile nicht die Interaktion, sondern nimmt die nächste Eingabe entgegen. Beendet wird es mit STRG+C (sieht man am ^CInterrupt). In der Bewertung steht
In Task 1 soll die Eingabe einer Leerzeile die gesamte Interaktion beenden (wie
":q" in ghci). Ansonsten gut.

Re: Sechste Hausübung online

Verfasst: 16. Jun 2011 19:03
von The Joker
yourmaninamsterdam hat vollkommen recht. Mir wurden auch drei Punkte gestrichen, mit der gleichen Begründung, obwohl doch geklärt wurde, dass Variante 1 richtig ist.

Re: Sechste Hausübung online

Verfasst: 16. Jun 2011 20:10
von sewe
OK, ich gucke es mir morgen noch mal an. Keine Panik.

Re: Sechste Hausübung online

Verfasst: 22. Jun 2011 17:08
von sewe
Die Bepunktung von Task 1 wurde im Zuge der Korrektur der siebten Hausübung korrigiert. Einige von Ihnen sollten jetzt 3 Punkte mehr haben.