Sechste Hausübung online

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Sechste Hausübung online

Beitrag 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

Wambolo
Computerversteher
Computerversteher
Beiträge: 381
Registriert: 18. Okt 2007 11:36

Re: Sechste Hausübung online

Beitrag 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.

Michael Z
Erstie
Erstie
Beiträge: 12
Registriert: 18. Apr 2011 13:53

Re: Sechste Hausübung online

Beitrag 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.

Wambolo
Computerversteher
Computerversteher
Beiträge: 381
Registriert: 18. Okt 2007 11:36

Re: Sechste Hausübung online

Beitrag 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?

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

yourmaninamsterdam
Nerd
Nerd
Beiträge: 681
Registriert: 26. Okt 2006 14:04
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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?

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

yourmaninamsterdam
Nerd
Nerd
Beiträge: 681
Registriert: 26. Okt 2006 14:04
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

yourmaninamsterdam
Nerd
Nerd
Beiträge: 681
Registriert: 26. Okt 2006 14:04
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

Taldera
Erstie
Erstie
Beiträge: 21
Registriert: 16. Nov 2006 11:46

Re: Sechste Hausübung online

Beitrag 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...

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

Michael Z
Erstie
Erstie
Beiträge: 12
Registriert: 18. Apr 2011 13:53

Re: Sechste Hausübung online

Beitrag 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.

Benutzeravatar
Pan
Erstie
Erstie
Beiträge: 20
Registriert: 3. Nov 2008 15:33

Re: Sechste Hausübung online

Beitrag von Pan »

monad_tutorial.jpg
monad_tutorial.jpg (45.26 KiB) 731 mal betrachtet
io-monad.jpg
io-monad.jpg (23.91 KiB) 731 mal betrachtet

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Sechste Hausübung online

Beitrag 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.

Antworten

Zurück zu „Archiv“