Impressum | Kontakt
 Startseite | Kurse Projekte | Haskell | Fortbildungen | Linux | Suche

Spezifikation der einzelnen Funktionen

Nun geht es darum, die einzelnen Funktionen zu implementieren. Die einzelnen Funktionen dürfen jetzt in ihrer Spezifikation nicht mehr geändert werden, da sie sonst später nicht mehr "zusammenpassen". Ist dies doch einmal nötig, so müssen bei einer Gruppenarbeit die darauf aufbauenden Gruppen informiert werden. Eigenmächtige Änderungen ohne Rücksprachen sind verpöhnt!

Satzzeichen entfernen

Da Worte durch Leerzeichen erkannt werden, wandelt diese Funktion alle Satzzeichen in ein Leerzeichen um.

  satzzeichenEntfernen :: Text -> Text


Text in Zeilen aufspalten

Jede Zeile eines mehrzeiligen Textes wird in eine Liste eingefügt. Eine Leerzeile (kein Text) wird durch eine leere Liste dargestellt. Diese Aufgabe entspricht der Spezifikation von lines.

  zeilenweise :: Text -> [Zeile]


Zeilen nummerieren

Für eine rein rekursive Lösung muss ein Akkumulator eingeführt werden, der die Zeilennummern schrittweise erhöht. Vielleicht gelingt auch eine Lösung mit Listcomprehension. Die vordefinierte zip-Funktion eignet sich noch besser.

  nummerieren :: [Zeile] -> [(Zeile,Int)]


jede Zeilen in Worte teilen


Jede Zeile enthält in der Regel viele Wörter. Diese müssen jetzt für alle Zeilen extrahiert werden. Dabei erhält jedes Wort der Zeile dieselbe Zeilennummer. Hierfür eignet sich die Haskellfunktion ,,words''. Diese Funktion ist etwas komplexer. Hier sollte man sich die Funktionsweise erst an einem einfachen Beispiel verdeutlichen:

  -- toWort [("Das ist mein",1),("erster Versuch",2)]
  toWort :: [(Zeile,Int)] -> [(Wort,Int)]


Kurze Wörter entfernen

Die rekursive Standardlösung ist wenig aufregend. Hier kann aber auch die Filterfunktion verwendet werden, die deutlich besser zu verstehen ist.

  entfernen :: [(Wort,Int)] -> [(Wort,Int)]


Liste aufsteigend sortieren

Als Sortieralgorithmus bietet sich der Quicksortalgorithmus für die erste Komponente an.

 sortieren :: [(Wort,Int)] -> [(Wort,Int)]


Gleiche Worte zusammenfassen


Zum Schluss müssen jetzt noch gleiche Wörter zusammengefasst werden. Diese befinden sich in der Liste unmittelbar hintereinander. Zu jedem Wort werden die einzelnen Zeilennummern in eine Liste von Zahlen eingefügt. Diese Funktion ist wieder etwas komplexer, kann aber durch einige Hilfsfunktionen bzw. lokale Definitionen schrittweise vereinfacht werden.

  zusammenfassen :: [(Wort,Int)] -> [(Wort,[Int])]


Damit haben wir alle Funktionen zusammen. Teste die Funktion an einigen konkreten Texten.