• Keine Ergebnisse gefunden

6.1 Noch einmal groupBy

N/A
N/A
Protected

Academic year: 2022

Aktie "6.1 Noch einmal groupBy"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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 —

(2)

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 —

(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 —

Referenzen

ÄHNLICHE DOKUMENTE

Bitte Fragen auf Seiten 21/22 in R.doc/pdf beantworten, und das gesamte Dokument lesen/in

Das Zeichen ‘%d’ steht nun als Ersatz für dezimale Zei- chen in der eingelesenen Zeichenkette, deren Wert an die Variablen note1-3 übergeben

Das erste Wort jeder Zeile ausgeben, das den Text made oder Made enthält awk '{ print $1 }' gedicht. Das erste Wort jeder

Hierbei modifizieren wir den Schritt 1.1 allerdings erheblich: Anstatt die erste Spalte zu suchen, die nicht ausschließlich aus Nullen besteht, entfernen wir auf

Zusammenfassend kann erkannt werden, dass eine Transformation, beziehungsweise auch eine Standardreduktion, durch folgenden Typ repräsentiert

Eine skalare Variable speichert eine einzelne Zahl

Nach dem Klassennamen werden im obigen Beispiel die Eigenschaften (hier: Variablen) für die Instanzen festgelegt: Jede Instanz, die wir gemäß diesem „Bauplan“ erzeugen, soll je

Die Wissenserwerbsprozesse beim Lernen aus Programmen, wie sie in der "zweiten Stunde" beim Lernen von LISP auftreten, können nun für Anfänger und Fortge- schrittene wie