Sechste Hausübung online
Sechste Hausübung online
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
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
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
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
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?
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
Wenn Sie mit der i-ten Eingabe die i-te Zeile meinen, dann ja. Schauen Sie sich dazu einmal den Testfall an: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?
Code: Alles auswählen
findWords "aaa ccc bbb\nrrr aaa ttt\nbbb ccc\n\n" == "aaa\nccc\nbbb\nrrr\nttt\n"
-
- Nerd
- Beiträge: 681
- Registriert: 26. Okt 2006 14:04
- Kontaktdaten:
Re: Sechste Hausübung online
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)
Variante 2 (es wird nach jeder Eingabe die geordnete Menge aller Wörter angezeigt, die bisher gesehen wurden)
Variante 3 (jeder Input wird eigenständig behandelt, lediglich mehrfache Vorkommnisse eines Wortes innerhalb eines Inputs werden gefiltert)
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?
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.
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.
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.
Re: Sechste Hausübung online
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.
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.
-
- Nerd
- Beiträge: 681
- Registriert: 26. Okt 2006 14:04
- Kontaktdaten:
Re: Sechste Hausübung online
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:Der gegebene Test widerspricht auch den beiden anderen.
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.sewe hat geschrieben:Hier gibt es leider eine nicht unbedeutende Betriebssystemabhängigkeit der Aufgabe:
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.
-
- Nerd
- Beiträge: 681
- Registriert: 26. Okt 2006 14:04
- Kontaktdaten:
Re: Sechste Hausübung online
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.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.
Re: Sechste Hausübung online
Wenn ich den unveränderten Haskell-Teil laden will, dann bekomme ich mehrere Compilerfehler:
Muss ich noch irgednwas dazu einstellen? Ich kann leider nicht in die Übungen kommen, falls es dort gesagt wurde...
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
Re: Sechste Hausübung online
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: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
Code: Alles auswählen
while = undefined
login = undefined
getString = undefined
Re: Sechste Hausübung online
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.
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.

@yourmaninamsterdam: Ihre fold- bzw. nub-Varianten können wir übrigens gerne am Freitag durchsprechen.
Re: Sechste Hausübung online
Kleine Anmerkung: Man das Buffering nicht nur global, sondern auch direkt in der printWords Funktion an/aus machen.sewe hat geschrieben:Testen mit import IO; hGetBuffering stdin, setzen mit import IO; hSetBuffering stdin LineBuffering
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
Re: Sechste Hausübung online
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.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.