Till Mossakowski Stephan Günther Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen
WS 2019/20
6. Übungsblatt
Ausgabe: 2019-11-24 Abgabe: 2019-12-02
6.1 Noch einmal groupBy
(1) Schreiben Sie eine eigene Implementierung der inData.Listdefinierten FunktiongroupBy. Nutzen Sie hierzu nur direkte Rekursion oderfoldl/foldr. Nutzen Sie insbesondere NICHTspanoderbreak. Anwendungsbeispiel:
groupBy (≤) [1 ,2 ,2 ,3 ,1 ,2 ,0 ,4 ,5 ,2] [[1 ,2 ,2 ,3 ,1 ,2] ,[0 ,4 ,5 ,2]]
(2) Die Programmiersprache Python liefert eine eigenegroupbyImplementierung, in der statt der Vergleichs- operation eine Funktion zur Generierung eines Schlüssels übergeben wird. Die Funktion liefert dann eine Liste von Paaren zurück, wobei das erste Element des Paars jeweils der generierte Schlüssel ist, und das zweite Element eine Liste von konsekutiven Elementen, denen der gleiche Schlüssel zugeordnet wird.
Anwendungsbeispiele:
groupby [
"one" , "two" , " six " , " ten " , " four " ,
" five " , " nine " , " three " , "seven" , " eight "
] length
[ (3 , [ "one" , "two" , " six " , " ten " ] ) , (4 , [ " four " , " five " , " nine " ] ) , (5 , [ " three " , "seven" , " eight " ] ) ]
groupby [
"one" , "two" , " three " , " four " , " five " ,
" six " , "seven" , " eight " , " nine " , " ten "
] length
[ (3 , [ "one" , "two" ] ) , (5 , [ " three " ] ) , (4 , [ " four " , " five " ] ) , (3 , [ " six " ] ) ,
(5 , [ "seven" , " eight " ] ) , (4 , [ " nine " ] ) ,
(3 , [ " ten " ] ) ]
Implementieren Sie diese Funktion in Haskell. Nutzen Sie hierbei wieder nur direkte Rekursion,foldl, foldl,mapoder ihre Implementierung vongroupBy.
— Seite 1 von 3 —
6. Übungsblatt
Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen WS 2019/20 ,
6.2 Unterstrich, Typen
(1) In der Vorlesung wurde inzwischen mehrfach die spezielle Bedeutung des Unterstrichs, “_”, als Pattern bei Funktionsdefinitionen erwähnt. Wählen Sie eine Ihnen bekannte Programmiersprache und diskutieren Sie folgende Fragen:
• Ist in dieser Programmiersprache der Unterstrich ebenfalls eine legaler Bezeichner?
• Falls ja, inwieweit unterscheidet sich die Verwendung des Unterstrichs in dieser Programmiersprache von der Verwendung in Haskell. Falls nein, gibt es in dieser Programmiersprache ein dem Unterstrich in Haskell ähnliches Konstrukt und fällt Ihnen eine weitere Programmiersprache ein, in der der Un- terstrich ein legaler Bezeichner ist?
• Diskutieren Sie die Konsequenzen, die das unterschiedliche Verhalten der beiden Ausdrücke
“let f _ _ = undefined” und “let g x x = undefined” inghcihat.
(2) In der Übung wurden die beiden Funktionenfoldl1undfoldr1besprochen. Erläutern Sie, warum sich die Typen der Funktionen von denen der Funktionenfoldlundfoldlunterscheiden.
6.3 Bündigkeit
Implementieren Sie links- und rechtsbündige Formatierung von Text.
Definieren Sie hierzu einen Datentyp
data Format=Flushleft | Flushright
zur Selektion der Formatierung, sowie eine Funktion j u s t i f y :: Format → I n t → String → String
die einen String so an Wortgrenzen1umbricht, dass keine Zeile länger ist als im zweiten Argument angegeben.2 Es soll aber auch jede Zeile so nah wie möglich an der geforderten Länge sein.
Beispiele:
putStrLn $ j u s t i f y Flushleft 5 "ab cd edfghij klm"
ab cd edfghij klm
l ="Lorem ipsum dolor s i t amet, consetetur sadipscing e l i t r , sed diam\n "
++ "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam\n "
++ " nerat , sed diam voluptua . At vero eos et accusam et justo duo \n "
++ " dolores et ea rebum. "
putStrLn $ j u s t i f y Flushleft 40 l Lorem ipsum dolor s i t amet, consetetur sadipscing e l i t r , sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam nerat , sed diam voluptua . At vero eos et accusam et justo duo dolores et ea rebum.
1Eine Wortgrenze wird hierbei so definiert, wie es in der vordefinierten Funktionwordsimplementiert ist.
2Ausser natürlich ein “Wort” ist bereits länger als die Angabe.
— Seite 2 von 3 —
6. Übungsblatt
Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen WS 2019/20 ,
6.4 * Zentrierung
Erweitern Sie den in Aufgabe 6.3 definierten DatentypFormatzu
data Format=Flushleft | Flushright | Center | Justify
und die Funktionjustifywie folgt.
Für dasFormat Centersoll die Funktion den Text zentriert ausrichten. Hierbei steht Ihnen frei, auf welcher Seite Sie bei Bedarf ein zusätzliches Leerzeichen einfügen.
Für dasFormat Justifysoll die Funktion den Text im Blocksatz ausrichten. Das heißt es müssen zusätzliche Leerzeichen eingefügt werden, die dafür sorgen, dass jede Zeile3genau die geforderte Länge hat. Dabei sollen die Leerzeichen so verteilt werden, dass innerhalb einer Zeile die Differenz der maximalen und der minimalen Anzahl an Leerzeichen zwischen zwei Worten nicht größer als eins ist. Darüber hinausgehende Freiheitsgrade bei der Verteilung der Leerzeichen dürfen Sie beliebig implementieren.
Beispiele:
putStrLn $ j u s t i f y Center 4 "ab cd edfghij klmn"
" ab " ++ " \n " ++
" cd " ++ " \n " ++
" edfghij " ++ " \n " ++
"klmn"
putStrLn $ j u s t i f y Justify 17 "a b c d h edfghijk lmn"
"ab cd h i " ++ " \n " ++
" edfghijk lmn"
3Ob Sie die letzte Zeile gesondert behandeln dürfen Sie selbst entscheiden.
— Seite 3 von 3 —