• Keine Ergebnisse gefunden

Aufgabe 1. Gegeben sei der Typ Nat aus der Vorlesung, definiert als data Nat = Zero | Succ Nat

N/A
N/A
Protected

Academic year: 2021

Aktie "Aufgabe 1. Gegeben sei der Typ Nat aus der Vorlesung, definiert als data Nat = Zero | Succ Nat"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Universit¨ at Siegen

Lehrstuhl Theoretische Informatik Carl Philipp Reh

Funktionales Programmieren SS 2020

Ubungsblatt 2 ¨

Aufgabe 1. Gegeben sei der Typ Nat aus der Vorlesung, definiert als data Nat = Zero | Succ Nat

(a) Implementieren Sie eine geeignete Show -Instanz f¨ ur Nat . L¨ osung.

i n s t a n c e Show Nat w h e r e show x = case x of

Zero -> " Zero "

Succ n -> " Succ ( " ++ show n ++ " ) "

(b) Implementieren Sie die Funktion f r o m I n t :: Int -> Nat

welche einen Int in Nat umwandelt. Dabei soll gelten, dass fromInt f¨ ur negative Zahlen Zero liefert und f¨ ur positive Zahlen n ≥ 0 soll Succ

n

(Zero) geliefert werden.

L¨ osung.

f r o m I n t x =

if x < 0 then Zero

else if x == 0 then Zero else Succ ( f r o m I n t ( x - 1) )

(c) Implementieren Sie die Funktion

fromInt ’ :: Int -> M a y b e Nat

welche im Gegensatz zu fromInt bei negativen Zahlen Nothing liefert.

L¨ osung.

fromInt ’ x = if x < 0 then N o t h i n g else Just ( f r o m I n t x )

1

(2)

(d) Implementieren Sie die Funktion add :: Nat -> Nat -> Nat

welche zwei Nat addiert. F¨ ur x, y ∈ N soll gelten, dass add(Succ

x

(Zero), Succ

y

(Zero)) = Succ

x+y

(Zero).

L¨ osung.

add x y = case x of Zero -> y

Succ x ’ -> Succ ( add x ’ y )

(e) Implementieren Sie eine Funktion, die es Ihnen erlaubt, explizite Rekur- sion bei Nat zu vermeiden. Implementieren Sie anschließen add , was wir nun add ’ nennen, dar¨ uber.

L¨ osung.

f o l d N a t :: ( a -> a ) -> a -> Nat -> a f o l d N a t f v n = case n of

Zero -> v

( Succ y ) -> f ( f o l d N a t f v y ) add ’ :: Nat -> Nat -> Nat

add ’ x y = f o l d N a t Succ y x

Ahnlich wie bei ¨ f o l d r f¨ ur Listen bekommt f o l d N a t drei Argumente:

• Die Funktion f :: a -> a, die wir f¨ ur jedes Succ einmal an- wenden.

• Den Anfangswert v :: a.

• Die nat¨ urliche Zahl n :: Nat selbst.

Die Funktion f o l d N a t liefert dann f¨ ur n = Succ

z

(Zero), wobei z ∈ N , den Wert f

z

(v). In der Implementierung von add w¨ ahlen wir f = Succ, v = Succ

y

(Zero) und n = Succ

x

(Zero), wobei x, y ∈ N . Damit erhalten wir, dass

add’(Succ

x

(Zero), Succ

y

(Zero)) = Succ

x

(Succ

y

(Zero)) = Succ

x+y

(Zero).

2

(3)

Aufgabe 2. Betrachten Sie den folgenden Baum:

10

4 3

2 5

7 8

Dieser besteht aus einem Wurzelknoten, der mit 10 beschriftet ist. Der Wur- zelknoten hat drei Kindknoten, welche mit 4, 3 und 5 beschriftet sind, usw.

(a) Definieren Sie eine geeignete Data-Deklaration f¨ ur B¨ aume. Es soll m¨ oglich sein, diese auch mit anderen Beschriftungen als Werte vom Typ Int zu versehen. Beschreiben Sie, welche Typkonstruktoren und Wertkonstruk- toren Sie definieren.

L¨ osung. data Tree a = Node a [ Tree a ]

Dies definiert den Typkonstruktor Tree :: * -> * und den Wert- konstruktor Node :: a -> [ Tree a ] -> Tree a.

(b) Implementieren Sie den obigen Baum.

L¨ osung.

t :: Tree Int

t = Node 10 [ Node 4 []

, Node 3 [ Node 2 []]

, Node 5 [ Node 7 [] , Node 8 []]]

(c) Implementieren Sie eine geeignete Show -Instanz f¨ ur Ihre B¨ aume.

L¨ osung.

i n s t a n c e Show a = > Show ( Tree a ) w h e r e show t = case t of

( Node x l ) -> " ( " ++ show x

++ " , " ++ show l ++ " ) "

Wir verwenden in unserer Implementierung show x, wobei x :: a, was show auf die Beschriftung des Wurzelknoten anwendet. Damit dies zur Verf¨ ugung steht, m¨ ussen wir Show a = > an den Anfang unserer Instanz-Deklaration schreiben. Nat¨ urlich muss dann auch der Element- typ des Baums Show implementieren. Wir verwenden ebenfalls show l, wobei l :: [ Tree a ]. Dies ruft die Show-Instanz von Listen auf, die wiederum show f¨ ur unsere B¨ aume aufruft.

3

(4)

(d) Implementieren Sie die Funktion p r e o r d e r :: Tree a -> [ a ]

welche die Preorder eines Baums als Liste liefert. Die Preorder vom Bei- spielbaum w¨ are 10, 4, 3, 2, 5, 7, 8.

L¨ osung.

p r e o r d e r t = case t of

( Node x l ) -> ( x : c o n c a t ( map p r e o r d e r l ) )

Die Funktion c o n c a t :: [[ a ]] -> [ a ] nimmt eine Liste von Lis- ten und konkateniert all ihre Elemente. Zum Beispiel gilt

c o n c a t [[1 ,2] ,[3]] = [1 ,2 ,3]

Die Funktion map :: ( a -> b ) -> [ a ] -> [ b ] wendet eine Funk- tion auf jedes Element einer Liste an. Zum Beispiel gilt

map show [1 ,2] = [ " 1 " , " 2 " ] (e) Implementieren Sie die Funktion

s u m T r e e :: Tree Int -> Int

welche die Werte eines Baums von Int aufsummiert.

L¨ osung. s u m T r e e t = f o l d r (+) 0 ( p r e o r d e r t )

4

Referenzen

ÄHNLICHE DOKUMENTE

[r]

Ubungen zur Linearen Algebra II ¨ Bergische Universit¨ at Wuppertal.. Blatt

Ein metrischer Raum (M , d ) heißt vollst¨ andig, wenn jede Cauchyfolge in M konvergiert.. Ist ein normierter Raum vollst¨ andig, so heißt

Auch die Scherungsinvarianz l¨asst sich aus (D1-3) herlei- ten.. Ent- sprechend hat man Linkssysteme f¨ur die linke Hand. Jedes unabh¨angige Tripel von Vek- toren bildet entweder

Jede NAT-Traversierungstechnik liefert zwei weitere Kriterien, die f¨ur den Verbindungs- aufbau eine Rolle spielen. Dies ist zum einen die Angabe, ob die Technik eine direkte oder

NVT9Mapping {üeordnete NVT9 Traversal9 Techniken}.. {NVT9

Befindet sich nur der Server hinter ei- nem NAT und der Client ist öffentlich er- reichbar, kann eine Verbindung mittels Connection Reversal hergestellt werden..

Parallel hole punching requires more resources on the peers than sequential hole punching, as multiple threads need to be running, more sockets are created and destroyed, and more