Seite 1 von 2

Sechste Hausübung online

Verfasst: 27. Mai 2011 10:31
von sewe
Hallo,

die (sechs) Aufgaben der sechsten Hausübung stehen jetzt online: https://cage.st.informatik.tu-darmstadt ... 011-05-27/. Abgabetermin ist Donnerstag, der 2.6., 23:59.

Viele Grüße,

Andreas Sewe

Re: Sechste Hausübung online

Verfasst: 27. Mai 2011 19:33
von Wambolo
Da ich leider die letzten beiden Präsenzübungen versäumt habe, ist wohl mal wieder einiges an mir vorbeigelaufen. Ich kapiere die Aufgabe 1 nicht so richtig. Ich hab eine String -> String Funktion geschrieben die den Test passiert, aber wie erreiche ich jetzt Ausgaben auf dem Bildschirm? Hat jemand einen Tip parat was ich mir zum Thema IO anlesen muss um die Aufgabe bewältigen zu können. Leider gibt es ja in den Slides nix dazu.

Re: Sechste Hausübung online

Verfasst: 27. Mai 2011 20:18
von Michael Z
Es gibt ein paar gute Tutorials, z. B. die Introduction auf haskell.org oder das IO Kapitel aus Learn You a Haskell.

Re: Sechste Hausübung online

Verfasst: 28. Mai 2011 15:04
von Wambolo
Danke, die Seiten sind gut, ohne Frage. Den Haskell Teil habe ich jetzt bis auf A1 fertig.
Ich frage mich ob ich da vielleicht was falsch verstanden habe. Soll die Ausgabe beim Test mit interact bei der n-ten Eingabe noch
die Wörter aus vergangenen Eingaben (0te - (n-1)te) berücksichtigen oder nicht?

Re: Sechste Hausübung online

Verfasst: 30. Mai 2011 09:06
von sewe
Wambolo hat geschrieben:Soll die Ausgabe beim Test mit interact bei der n-ten Eingabe noch die Wörter aus vergangenen Eingaben (0te - (n-1)te) berücksichtigen oder nicht?
Wenn Sie mit der i-ten Eingabe die i-te Zeile meinen, dann ja. Schauen Sie sich dazu einmal den Testfall an:

Code: Alles auswählen

findWords "aaa ccc bbb\nrrr aaa ttt\nbbb ccc\n\n" == "aaa\nccc\nbbb\nrrr\nttt\n"
In der ersten Zeile steht "aaa", daher wird das Wort nur in der ersten, nicht aber in der zweiten Zeile erneut ausgegeben. Hoffe, das klärt das.

Re: Sechste Hausübung online

Verfasst: 1. Jun 2011 00:29
von yourmaninamsterdam
Je mehr ich drüber nachdenke, desto unklarer wird mir, wie die Interaktion verlaufen soll. Welche der drei folgenden Varianten wäre richtig?

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.
Variante 2 (es wird nach jeder Eingabe die geordnete Menge aller Wörter angezeigt, die bisher gesehen wurden)

Code: Alles auswählen

*Lab8 System.IO> printWords
test me plz

test
me
plz
test me again

test
me
again
test me more

test
me
again
more
^CInterrupted.
Variante 3 (jeder Input wird eigenständig behandelt, lediglich mehrfache Vorkommnisse eines Wortes innerhalb eines Inputs werden gefiltert)

Code: Alles auswählen

*Lab8 System.IO> printWords
test me plz

test
me
plz
test me again

test
me
again
test me more

test
me
more
^CInterrupted.
Ich möchte schon vorab dazu sagen, dass ich die ganze Zeit von Variante 1 ausgegangen bin. Hier hört sich das aber eher nach Variante 3 an. Und wieso genau soll man nub (dann) nicht benutzen?

Re: Sechste Hausübung online

Verfasst: 1. Jun 2011 16:38
von sewe
Es ist in der Aufgabenstellung (wie Sie ganz richtig vermutet haben), von Variante 1 die Rede. Der gegebene Test widerspricht auch den beiden anderen.

Ein Tip: Versuchen Sie bitte zuerst, den Test zum Laufen zu bekommen, bevor Sie manuelle Versuche mit printWords starten.

Hier gibt es leider eine nicht unbedeutende Betriebssystemabhängigkeit der Aufgabe: Je nach OS benutzt ghci einen unterschiedlichen BufferingMode. (Näheres finden Sie hier: http://book.realworldhaskell.org/read/io.html#io.lazy unter Buffering Modes). Stellen Sie daher bitte sicher, dass Sie den LineBuffering Modus benutzen. (Testen mit import IO; hGetBuffering stdin, setzen mit import IO; hSetBuffering stdin LineBuffering). Ansonsten sorgt das sofortige Echo dafür, dass sich Ein- und Ausgabe stellenweise vermischen.

Re: Sechste Hausübung online

Verfasst: 1. Jun 2011 18:58
von yourmaninamsterdam
sewe hat geschrieben:Der gegebene Test widerspricht auch den beiden anderen.
Dem möchte ich widersprechen. Im Testfall wird lediglich eine Eingabe getätigt (es gibt nur eine Leerzeile ganz am Ende). Ich spreche vom Verhalten im Bezug auf weitere Eingaben. Alle Programme, die irgendeine der drei Varianten implementieren, würden den Testfall erfüllen.
sewe hat geschrieben:Hier gibt es leider eine nicht unbedeutende Betriebssystemabhängigkeit der Aufgabe:
Das ist in der Tat wahr. Ich bin mir allerdings nicht ganz sicher, ob das lediglich eine Betriebssystemabhängigkeit ist. Ich habe mich sehr viele Stunden mit dem Problem rumgeschlagen, bis ich bei StackOverflow den Hinweis zum Buffering erhalten habe. Obwohl mein GHCi genau dieses Verhalten zeigt, habe ich den Modus übrigens bei meiner aktuellen Implementierung nicht verstellt. Ich bin auch nicht sicher, was da genau das Problem ist, weil Varianten des Programms, mit denen es meines Erachtens genauso funktionieren müsste, plötzlich wieder das Buffering-Problem haben.

Mich würde in dem Zusammenhang der Hintergrundgedanke bei dieser Aufgabe interessieren. Im Moment gewinne ich immer mehr den Eindruck, dass sie einfach ein Zeitfresser ist und bestenfalls undurchdacht. Insbesondere auch das nub-Verbot.

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 01:52
von yourmaninamsterdam
yourmaninamsterdam hat geschrieben:Ich bin auch nicht sicher, was da genau das Problem ist, weil Varianten des Programms, mit denen es meines Erachtens genauso funktionieren müsste, plötzlich wieder das Buffering-Problem haben.
Hier lässt sich noch hinzufügen, dass wenn ich eine Funktion, die ich mit Hilfe von fold implementiert habe, duch nub ersetze, genau das genannte Buffering-Problem auftritt.

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 13:17
von Taldera
Wenn ich den unveränderten Haskell-Teil laden will, dann bekomme ich mehrere Compilerfehler:

Code: Alles auswählen

task-1-4.hs:56:1:
    The type signature for `while' lacks an accompanying binding

task-1-4.hs:71:1:
    The type signature for `login' lacks an accompanying binding

task-1-4.hs:74:17: Not in scope: `login'

task-1-4.hs:76:13: Not in scope: `login'

task-1-4.hs:84:1:
    The type signature for `getString' lacks an accompanying binding
Muss ich noch irgednwas dazu einstellen? Ich kann leider nicht in die Übungen kommen, falls es dort gesagt wurde...

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 14:07
von sewe
Taldera hat geschrieben:Wenn ich den unveränderten Haskell-Teil laden will, dann bekomme ich mehrere Compilerfehler:

Code: Alles auswählen

task-1-4.hs:56:1:
    The type signature for `while' lacks an accompanying binding

task-1-4.hs:71:1:
    The type signature for `login' lacks an accompanying binding

task-1-4.hs:74:17: Not in scope: `login'

task-1-4.hs:76:13: Not in scope: `login'

task-1-4.hs:84:1:
    The type signature for `getString' lacks an accompanying binding
Ja, das liegt daran, dass Sie diese in Task 4 erst selbst implementieren müssen. Für den Moment (wenn Sie zuerst Tasks 1-3 bearbeiten wollen), können Sie sich mit folgenden Definitionen behelfen:

Code: Alles auswählen

while = undefined
login = undefined
getString = undefined
Sie können besagte Funktionen dann später ausimplementieren.

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 14:20
von sewe
Eine Anmerkung noch zum Buffering: hugs (verhält sich sonst weitgehend wie ghci) puffert immer zeilenweise; es scheint nur ghci zu sein, der auf manchen System nur zeilenweise tut.

Was den Sinn und Zweck dieser Aufgabe anbelangt: Sie lernen, dass es durch Laziness extrem schwer wird, die Auswertungsreihenfolge vorherzusagen, selbst wenn nicht noch etwas wie Buffering dazwischenpfuscht. ;-) Daher: Schauen Sie einfach, dass Sie den Test bestehen und ihr printWords im interaktiven Modus nicht bis in alle Ewigkeiten hängt (wie z.B. das interact reverse vom letzten Freitag), dann haben Sie die Aufgabe aus unserer Sicht bereits erfolgreich gelöst.

@yourmaninamsterdam: Ihre fold- bzw. nub-Varianten können wir übrigens gerne am Freitag durchsprechen.

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 15:26
von Michael Z
sewe hat geschrieben:Testen mit import IO; hGetBuffering stdin, setzen mit import IO; hSetBuffering stdin LineBuffering
Kleine Anmerkung: Man das Buffering nicht nur global, sondern auch direkt in der printWords Funktion an/aus machen.
Wenn man das global setzt wird die ghci Bedienung sehr unhandlich, weil man alles blind eingeben muss.

Code: Alles auswählen

printWords = do
    hSetBuffering stdin LineBuffering
    interact findWords
    hSetBuffering stdin NoBuffering
Mir ist das dummerweise erst aufgefallen, nachdem ich das Buffering-Problem durch eine verzögernde Hilfsfunktion los geworden bin.

Re: Sechste Hausübung online

Verfasst: 2. Jun 2011 15:40
von Pan
monad_tutorial.jpg
monad_tutorial.jpg (45.26 KiB) 742 mal betrachtet
io-monad.jpg
io-monad.jpg (23.91 KiB) 742 mal betrachtet

Re: Sechste Hausübung online

Verfasst: 3. Jun 2011 09:32
von sewe
yourmaninamsterdam hat geschrieben:Dem möchte ich widersprechen. Im Testfall wird lediglich eine Eingabe getätigt (es gibt nur eine Leerzeile ganz am Ende). Ich spreche vom Verhalten im Bezug auf weitere Eingaben. Alle Programme, die irgendeine der drei Varianten implementieren, würden den Testfall erfüllen.
Ah, jetzt habe ich sie verstanden; für Sie ist einen Eingabe nicht einen Zeile, sondern "alles bis zur Leerzeile". Unsere Intention war, dass printWords nach einer Leerzeile zum ghci-Prompt zurückkehrt. In diesem Fall soll sich der nächste Aufruf von printWords natürlich genau wie der vorige verhalten. Aber ich verstehe, dass man das auch anders interpretieren kann.