i

Übungen

Aufgabe 1 - Anonyme Funktionen

Formuliere mit Hilfe von anonymen Funktionen folgende Funktionen:

a) Eine Funktion, die eine Liste von Zahlen auf deren Quadratzahlen abbildet und z.B. so aufgerufen werden kann:

> quadratzahlen [2, 4, 3]
[4,16,9] : List Int

b) Eine Funktion, die alle ungeraden Zahlen einer Liste zurückgibt und z.B. so aufgerufen werden kann:

> ungerade [2, 4, 3, 5, 6]
[3,5] : List Int

c) Eine Funktion, die eine Liste von Zahlen aufsummiert, wenn sie größer als eine gegebene Zahl sind und z.B. so aufgerufen werden kann:

> summeAb 5 [5, 8, 2, 3, 7] 
20 : Int

d) Eine Funktion, die aus einer Liste von Noten eine Liste mit den Werten "bestanden" oder "nicht bestanden" berechnet und z.B. so aufgerufen werden kann:

> bestanden [2, 5, 1, 4, 6]
["bestanden", "nicht bestanden", "bestanden", "bestanden", "nicht bestanden"]
    : List String

Aufgabe 2 - Partiell angewandte Funktionen

Der REPL-Dialog benutzt partiell angewandte Funktionen.

> begruessung = String.append "hallo "
<function> : ...
> begruessung "Alex"
...
> wiederhole = String.repeat 4  
<function> : ...
> "T" ++ (wiederhole "o") ++ "r"
...
> m = (-) 0
<function> : ...
> m 5
...
> n = (>=) 0
<function> : ...
> n -1
...
> plus x = (+) x
<function> : ...
> inc = plus 1
<function> : ...
> inc 4
...

Stelle zunächst Vermutungen auf, was jeweils anstelle von ... steht. Überprüfe, indem du den REPL-Dialog selbst führst. Erkläre die Ergebnisse.

Aufgabe 3 - Listenverarbeitung mit partiell angewandten Funktionen

Der REPL-Dialog benutzt partiell angewandte Funktionen zur Verarbeitung von Listen.

> List.map ((+) 1) [0,1,2,3]
...
> List.map ((++) "be") ["laden","grüßen","suchen"]
...
> List.filter ((>) 0) [0,1,-1,2,-2]
...
> List.map (String.repeat 2) ["ha","li","ha","lo"]
...
> List.map ((\x y -> y - x) 5) [5,6,7,8]
...
> List.filter ((\x y -> y > x) 0) [0,1,-1,2,-2] 
...

Stelle zunächst Vermutungen auf, was jeweils anstelle von ... steht. Überprüfe, indem du den REPL-Dialog selbst führst. Erkläre die Ergebnisse.

Aufgabe 4 - Caesar-Verfahren und Funktionskomposition

a) Buchstaben verschieben

Beim Caesar-Verfahren werden (Groß-) Buchstaben duch (Groß-) Buchstaben ersetzt, die im Alphabet um 3 Einheiten verschoben sind. Der Buchstabe 'G' wird also durch 'J' ersetzt, der Buchstabe 'Y' durch den den zyklisch im Alphabet verschobenen Buchstaben 'B'.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
| | | | | | | | | | | | | | | | | | | | | | | | | |
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

Eine Buchstabenverschiebung lässt sich mit Hilfe vordefinierter Funktionen so realisieren:

Char.toCode 'Y' -> 89 
89 - 65 -> 24
24 + 3 -> 27
modBy 26 27 -> 1
65 + 1 -> 66
Char.fromCode 66 -> 'B'

Entwickle eine Implementierung dieser Buchstabenverschiebung. Benutze dabei den Pipe-Operator oder den Kompositionsoperator.

b) Einen Text verschlüsseln

Die Verschlüsselung ganzer Zeichenketten lässt sich mit Hilfe der String.map-Funktion realisieren. Man könnte aber auch ohne diese Funktion auskommen und die Verschlüsselung mit Hilfe von Listen und der List.map-Funktion realisieren. Dazu müsste man eine Zeichenkette in eine Liste umwandeln, um diese dann zu verarbeiten:

String.toList "HALLO" -> ['H','A','L','L','O']
List.map (... Buchstabenverschiebung ...) ['H','A','L','L','O'] -> ['K','D','O','O','R']
String.fromList ['K','D','O','O','R'] -> "KDOOR"

Implementiere diese Verschlüsselung von Zeichenketten. Benutze dabei den Pipe-Operator oder den Kompositionsoperator.

Aufgabe 5

Gar nicht so einfach: Versuche vorherzusagen, welche Rückgaben die in den folgenden REPL-Dialogen definierten Funktion liefern. Teste und erkläre die Ergebnisse.

> f1 = (\x -> x - 1) >> (+) 1
<function> : number -> number
> f1 4
...
> f2 = \liste -> liste |> List.filter (\x -> x > 0) |> List.map (\x -> 0 - x)
<function> : List number -> List number
> f2 [-3,0,2,4,-1]
...
> f3 = \f -> List.map f (List.range 1 10)
<function> : (Int -> a) -> List a
> f3 ((-) 0)
...
> f4 = \liste -> liste |> List.sort |> List.take 1
<function> : List comparable -> List comparable
> f4 [4,6,1,3]
...
> f5 = \x -> x |> (++) "(" |> (\y -> y ++ ")")
<function> : String -> String
> f5 "x"
...
> f6 = \i -> List.filter (\x -> x > i)
<function> : comparable -> List comparable -> List comparable
> f6 3 [1,2,3,4,5]
...

Suche

v
8.2.2.6.4
schuljahr.inf-schule.de/aktuell/deklarativ/fp_elm/elm_programme/funktionenerzeugen/uebungen
schuljahr.inf-schule.de/aktuell/8.2.2.6.4
schuljahr.inf-schule.de/aktuell/@/page/atxzyLk3yDPG3Woh

Rückmeldung geben