i

Ü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.

Suche

v
8.2.2.8.3
dev.inf-schule.de/deklarativ/fp_elm/elm_programme/typdefinition/uebungen
dev.inf-schule.de/8.2.2.8.3
dev.inf-schule.de/@/page/MTcZpnGA6sjGel6h

Rückmeldung geben