Übungen
Aufgabe 1
Im folgenden REPL-Dialog fehlen die Ergebnisse.
> liste = [1,2,3]
...
> 0 :: liste
...
> 0 :: 0 :: liste
...
> [0] ++ liste
...
> liste ++ [0]
...
(a) Stelle Vermutungen auf, was an Stelle der drei Punkte jeweils erscheint. Überprüfe, indem du den Dialog selbst führst.
(b) Der Dialog verdeutlicht auch, dass die beiden Funktionen ::
und ++
jeweils neue Listen erzeugen.
Woran erkennt man das hier? Erläutere.
Aufgabe 2
Hier werden vordefinierte Listenfunktionen benutzt. Informiere dich vorab auf Elm - List, was die Funktionen leisten. Führe anschließend den folgenden REPL-Dialog aus und erkläre die Ergebnisse.
> List.range 1 10
...
> List.sum (List.range 0 20)
...
> List.repeat 3 'o'
...
> List.reverse (List.sort ['e','u','a','i','o'])
...
> (List.range 2 4) :: (List.range 6 8) :: []
...
> List.concat ((List.range 2 4) :: (List.range 6 8) :: [])
...
Hinweis: Man muss nicht alle diese vordefinierten Funktionen aktiv kennen. Man schlägt sie bei Bedarf in einer Dokumentation nach.
Aufgabe 3
(a) Im Folgenden sollen Funktionen zu Listen von geraden Zahlen geschrieben werden. Dazu benötigst du eine Funktion, die überprüft, ob eine Zahl eine gerade Zahl ist. Schreibe die Funktion gemäß folgender Signatur:
geradeZahl : Int -> Bool
geradeZahl n =
...
(b) Schreibe eine Funktion, die eine Liste aller geraden Zahlen bis n zurückgibt und sich folgendermaßen aufrufen lässt:
> geradeZahlen 6
[0,2,4,6] : List Int
> geradeZahlen 11
[0,2,4,6,8,10] : List Int
(c) Schreibe eine Funktion, die überprüft, ob eine Liste nur gerade Zahlen enthält. Nutze dazu die Dokumentation des Listen-Moduls. Die Anwendung in der REPL kann folgendermaßen aussehen:
> nurGeradeZahlen [ 1, 3, 4, 7, 8 ]
False : Bool
> nurGeradeZahlen [ 2, 6, 8, 14, 28 ]
True : Bool
(d) Schreibe analoge Funktionen für Vielfache von n. Deren Anwendung ergibt z.B.:
> vielfacheVon 3 20
[0,3,6,9,12,15,18]
: List Int
> vielfacheVon 5 20
[0,5,10,15,20] : List Int
und
> nurVielfacheVon 3 [2, 6, 12]
False : Bool
> nurVielfacheVon 3 [3, 6, 12]
True : Bool
Aufgabe 4
(a) Schreibe eine Funktion, die überprüft, ob ein Zeichen ein Vokal ist. Berücksichtige dabei nur Großbuchstaben. Die Signatur der Funktion lautet:
istVokal : Char -> Bool
(b) Schreibe eine Funktion, welche die Zahl der Vokale einer Zeichenkette ermittel. Ein Aufruf sieht dann beispielsweise so aus:
> zaehleVokale "HALLO"
2 : Int
(c) Schreibe eine analoge Funktion für beliebige, einzelne Zeichen. Deren Anwendung ergibt z.B.:
> zaehleZeichen 'H' "HALLO"
1 : Int
> zaehleZeichen 'L' "HALLO"
2 : Int
Aufgabe 5
Die Ergebnisse von Lottoziehungen werden mit Hilfe von Listen verwaltet.
lottoziehungen : List (List Int)
lottoziehungen =
[ [ 3, 6, 13, 23, 40, 41 ]
, [ 5, 6, 20, 25, 44, 49 ]
, [ 10, 21, 22, 23, 39, 41 ]
, [ 1, 11, 17, 45, 47, 48 ]
]
Entwickle eine Funktion, mit der man die relative Häufigkeit einer Zahl ermitteln kann:
haeufigkeit : Int -> List (List Int) -> Float
haeufigkeit zahl ziehungen =
...
Der Aufruf ergibt in diesem Fall z.B.:
> haeufigkeit 5 lottoziehungen
0.25 : Float
> haeufigkeit 6 lottoziehungen
0.5 : Float