Übungen
Aufgabe 1
Gegeben ist eine Typdefinition für Himmelsrichtungen. Ergänze die Funktionsdefinitionen und teste die Funktionsaufrufe.
type Richtung
= N
| O
| S
| W
drehen: Richtung -> Richtung
drehen richtung =
-- im Uhrzeigersinn drehen
case richtung of
N -> ...
umwandlung: Richtung -> String
umwandlung richtung =
case richtung of
N -> "Norden"
...
Aufgabe 2
Beim Münzwurf gibt es nur die beiden Ergebnisse "Kopf" und "Zahl".
(a) Entwickle einen geeigneten Datentyp für die Ergebnisse eines Münzwurfs (mit type
) sowie für eine Serie von Münzwürfen (mit type alias
).
(b) Entwickle eine Funktion, die zurückliefert, wie oft "Kopf" in einer Wurfserie vorkommt.
> anzahlKopf [Kopf, Kopf, Zahl, Kopf, Zahl]
3 : Int
Aufgabe 3
Bei Sportveranstaltungen müssen eventuell auftretende Verletzungen dokumentiert werden. Dabei muss das Körperteil und falls sinnvoll die Körperseite angegeben werden. Definiere Datentypen für Körperseite und Körperteil. Schreibe eine Funktion, die eine Verletzung als String zurück gibt und sich z.B. so benutzen lässt:
> verletzung Kopf
"Verletzung am Kopf" : String
> verletzung Bauch
"Verletzung am Bauch" : String
> verletzung (Arm Rechts)
"Verletzung am rechten Arm" : String
Aufgabe 4
Definiere einen Datentyp für geometrische Formen. Es sollen Kreise und Rechtecke unterstützt werden. Ein Kreis hat einen Radius, ein Rechteck eine Breite und eine Höhe. Schreibe eine Funktion, die die Fläche einer Form berechnet und sich z.B. so aufrufen lässt:
> kreis = Kreis 5
Kreis 5 : Form
> flaeche kreis
78.53981633974483 : Float
> rechteck = Rechteck 3 4
Rechteck 3 4 : Form
> flaeche rechteck
12 : Float
Aufgabe 5
In einem vorherigen Kapitel hatten wir eine Funktion genutzt, die den tagesabhängigen Grundpreis für ein Schwimmbad berechnet. Die Funktion hatte folgende Form:
grundpreisAb10: String -> Int
grundpreisAb10 tag =
case tag of
"MO" -> 4
"DI" -> 4
"MI" -> 4
"DO" -> 5
"FR" -> 5
"SA" -> 6
"SO" -> 6
_ -> 0
Beschreibe warum die Modellierung nicht optimal war und verbessere die Modellierung mit einem geeigneten Datentyp.
Aufgaben zum Interpreter
Um die folgenden Aufgaben lösen zu können, musst du das Interpreter-Beispiel bearbeitet haben.
Aufgabe i1
Gegeben ist eine Typdefinition für Bewegungsbefehle. Ergänze die Funktionsdefinitionen und teste den Funktionsaufruf.
module Typdefinition exposing (..)
type Befehl
= LI -- links
| RE -- rechts
| VW Int -- vorwärts ...
type alias Programm = List Befehl
programm1: Programm
programm1 = [VW 2, RE, VW 4, LI, VW 2]
anzahlDrehBefehle: Programm -> Int
anzahlDrehBefehle programm =
case programm of
[] -> ...
b::rListe ->
case b of
LI -> ...
RE -> ...
VW x -> ...
> import Typdefinition exposing (..)
> anzahlDrehBefehle [RE,VW 1,LI,VW 2,LI,LI]
4 : Int
Aufgabe (schwierig) i2
Gegeben sind eine Typdefinition für Bewegungsbefehle und zwei (teils unvollständige) Funktionsdefinitionen.
module Typdefinition exposing (..)
type Befehl
= VW Int -- vorwärts ...
| LI -- links
| RE -- rechts
| WH Int (List Befehl) -- wiederhole ...
anzahlDrehungen: Befehl -> Int
anzahlDrehungen befehl =
case befehl of
LI -> 1
RE -> 1
VW x -> 0
WH n befehle -> n * (List.map anzahlDrehungen befehle |> List.foldr (+) 0)
wegLaenge: Befehl -> Int
wegLaenge befehl =
...
> import Typdefinition exposing (..)
> anzahlDrehungen (WH 2 [VW 3,WH 4 [VW 2,RE]])
8 : Int
> wegLaenge (WH 2 [VW 3,WH 4 [VW 1,RE]])
14 : Int
(a) Erkläre alle Details der Funktionsdefinition für die Funktion anzahlDrehungen
.
(b) Entwickle analog eine Funktionsdefinition für die Funktion wegLaenge
.