From 7ddcd77b364013f84a7112ce00a745da39cd1220 Mon Sep 17 00:00:00 2001 From: Stefan Dresselhaus Date: Sun, 17 Apr 2016 18:13:24 +0200 Subject: [PATCH] migrated changes to all other files --- Übungen/Blatt1.hs | 89 +++++++++++++++++++++++++------------------- Übungen/Blatt1.lhs | 65 +++++++++++++++----------------- Übungen/Blatt1.pdf | Bin 145796 -> 145927 bytes 3 files changed, 82 insertions(+), 72 deletions(-) diff --git a/Übungen/Blatt1.hs b/Übungen/Blatt1.hs index 2397685..85e1ef4 100644 --- a/Übungen/Blatt1.hs +++ b/Übungen/Blatt1.hs @@ -1,11 +1,11 @@ -{- +{- Übungsblatt 1 ============= Typtheorie ---------- -Schreiben sie alle **möglichen** Implementationen der folgenden +Schreiben Sie alle **möglichen** Implementationen der folgenden Funktionen. Wozu könnte `fun2` nützlich sein? -} @@ -18,61 +18,71 @@ fun2 = _fun2 fun3 :: (Eq a) => a -> a -> Bool fun3 = _fun3 -{- Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der -simpelste hiervon ist `Identity`, der genau gar nichts macht, sondern -nur einen anderen Typen einpackt.-} +{- +Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der +simpelste hiervon ist `Identity`, der nur einen anderen Typen einpackt. +-} data Identity a = Identity a {- Diese Definition stellt uns automatisch den Konstruktor `Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt. -Schreiben sie die Funktion -} +Schreiben Sie die Funktion +-} unIdentity :: Identity a -> a unIdentity = _unIdentity -{- welche diesen Vorgang wieder rückgängig macht. +{- +welche diesen Vorgang wieder rückgängig macht. -Angenommen, sie hätten nun ein Wert vom Typen `Identity a` und eine -Funktion mit dem Typen `a -> b`. Wie wenden sie diese auf das `a` +Angenommen, Sie hätten nun ein Wert vom Typen `Identity a` und eine +Funktion mit dem Typen `a -> b`. Wie wenden Sie diese auf das `a` "innerhalb" des `Identity` an um ein `Identity b` herzustellen? -Schreiben sie also eine Funktion-} +Schreiben Sie also eine Funktion +-} mapIdentity :: (a -> b) -> Identity a -> Identity b mapIdentity = _mapIdentity -{- **Hinweis:** Es gibt *zwei* prinzipielle Vorgehen dieses zu -implementieren. Kommen sie auf beide? +{- +**Hinweis:** Es gibt *zwei* prinzipielle Vorgehen dieses zu +implementieren. Kommen Sie auf beide? Funktionen sind auch nur Typen ------------------------------ -Datentypen können auch Funktionen enthalten. Sehen sie sich einmal den -Datentypen-} +Datentypen können auch Funktionen enthalten. Sehen Sie sich einmal den +Datentypen +-} data Pred a = Pred (a -> Bool) -{- an. Hier wird ein Prädikat definiert, welches (gegeben einen Datentyp +{- +an. Hier wird ein Prädikat definiert, welches (gegeben einen Datentyp `a`) eine Funktion gespeichert hat, die `a` in einen `Bool` umwandeln kann (etwa um irgendwas zu filtern/selektieren/löschen/..., wenn man dies an eine weitere Funktion übergibt). -Auch hier können sei eine Funktion schreiben, die das `Pred a` wieder -"auspackt". Definieren sie-} +Auch hier können Sie eine Funktion schreiben, die das `Pred a` wieder +"auspackt". Definieren Sie +-} unPred :: Pred a -> (a -> Bool) unPred = _unPred -{- Da Haskell-Funktionen aber "gecurried" sind, können sie die Klammern -hinten in der Signatur auch weglassen und erhalten -`unPred :: Pred a -> a -> Bool`, was man zugleich als "wende `Pred a` -an, wenn du ein `a` bekommst" lesen kann. In der Tat sind beide -Funktionen identisch (wieso?). +{- +Da Haskell-Funktionen aber "gecurried" sind (mehr dazu in der +Vorlesung), können Sie die Klammern hinten in der Signatur auch +weglassen und erhalten `unPred :: Pred a -> a -> Bool`, was man zugleich +als "wende `Pred a` an, wenn du ein `a` bekommst" lesen kann. In der Tat +sind beide Funktionen identisch (wieso?). Bonus -Was für eine Funktion bräuchten sie um ein `Pred a` in ein `Pred b` -umzuwandeln? Können sie diese Implementieren?-} +Was für eine Funktion bräuchten Sie um ein `Pred a` in ein `Pred b` +umzuwandeln? Können Sie diese implementieren? +-} mapPred :: _fun -> Pred a -> Pred b mapPred = _mapPred @@ -82,26 +92,29 @@ Neue Typen erfinden ------------------- In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden -von eigenen Datentypen. Zur Erinnerung; es gibt 2 Möglichkeiten, die man -miteinander kombinieren kann: `data Prod a b c = Prod a b c` benötigt -sowohl `a`, `b` als auch `c` um einen Wert zu erzeugen, -`data Sum a b = Sum1 a | Sum2 b` braucht entweder ein `a` um durch den -Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder ein `b` um durch den -Konstruktor `Sum2` ein `Sum a b` zu erzeugen. +von eigenen Datentypen. Zur Erinnerung; es gibt zwei Möglichkeiten, die +man miteinander kombinieren kann: `data Prod a b c = Prod a b c` +(Produkttyp) benötigt sowohl `a`, `b` als auch `c` um einen Wert zu +erzeugen, `data Sum a b = Sum1 a | Sum2 b` (Summentyp) braucht entweder +ein `a` um durch den Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder +ein `b` um durch den Konstruktor `Sum2` ein `Sum a b` zu erzeugen. -Definieren sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren -besitzt: Einen Konstruktor, der durch ein `a` ein `Vielleicht a` +Definieren Sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren +besitzt: Einen Konstruktor, mit dem durch ein `a` ein `Vielleicht a` konstruiert wird und ein zweiter Konstruktor, der keinen Wert nimmt, -sondern die "Abwesenheit eines `a`" symbolisieren soll.-} +sondern die "Abwesenheit eines `a`" symbolisieren soll. +-} data Vielleicht a = Exercise -{- Können sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn -ja, implementieren sie diese; wenn nein, geben sie eine kurze +{- +Können Sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn +ja, implementieren Sie diese; wenn nein, geben Sie eine kurze Begründung. -Wie würden sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein -`Vielleicht b` wandeln? Implementieren sie-} +Wie würden Sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein +`Vielleicht b` wandeln? Implementieren Sie +-} mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b mapVielleicht = _mapVielleicht @@ -111,5 +124,5 @@ Bonus Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der Unterschied zwischen einem `Pred (Vielleicht a)` und einem -`Vielleicht (Pred a)`? Oder sind diese Identisch? +`Vielleicht (Pred a)`? Oder sind diese identisch? -} diff --git a/Übungen/Blatt1.lhs b/Übungen/Blatt1.lhs index 981f582..21306ac 100644 --- a/Übungen/Blatt1.lhs +++ b/Übungen/Blatt1.lhs @@ -4,7 +4,7 @@ Typtheorie ---------- -Schreiben sie alle **möglichen** Implementationen der folgenden +Schreiben Sie alle **möglichen** Implementationen der folgenden Funktionen. Wozu könnte `fun2` nützlich sein? > fun1 :: a -> a @@ -17,36 +17,35 @@ Funktionen. Wozu könnte `fun2` nützlich sein? > fun3 = _fun3 Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der -simpelste hiervon ist `Identity`, der genau gar nichts macht, sondern -nur einen anderen Typen einpackt. +simpelste hiervon ist `Identity`, der nur einen anderen Typen einpackt. > data Identity a = Identity a Diese Definition stellt uns automatisch den Konstruktor `Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt. -Schreiben sie die Funktion +Schreiben Sie die Funktion > unIdentity :: Identity a -> a > unIdentity = _unIdentity welche diesen Vorgang wieder rückgängig macht. -Angenommen, sie hätten nun ein Wert vom Typen `Identity a` und eine -Funktion mit dem Typen `a -> b`. Wie wenden sie diese auf das `a` +Angenommen, Sie hätten nun ein Wert vom Typen `Identity a` und eine +Funktion mit dem Typen `a -> b`. Wie wenden Sie diese auf das `a` "innerhalb" des `Identity` an um ein `Identity b` herzustellen? -Schreiben sie also eine Funktion +Schreiben Sie also eine Funktion > mapIdentity :: (a -> b) -> Identity a -> Identity b > mapIdentity = _mapIdentity **Hinweis:** Es gibt *zwei* prinzipielle Vorgehen dieses zu -implementieren. Kommen sie auf beide? +implementieren. Kommen Sie auf beide? Funktionen sind auch nur Typen ------------------------------ -Datentypen können auch Funktionen enthalten. Sehen sie sich einmal den -Datentype +Datentypen können auch Funktionen enthalten. Sehen Sie sich einmal den +Datentypen > data Pred a = Pred (a -> Bool) @@ -55,22 +54,22 @@ an. Hier wird ein Prädikat definiert, welches (gegeben einen Datentyp kann (etwa um irgendwas zu filtern/selektieren/löschen/..., wenn man dies an eine weitere Funktion übergibt). -Auch hier können sei eine Funktion schreiben, die das `Pred a` wieder -"auspackt". Definieren sie +Auch hier können Sie eine Funktion schreiben, die das `Pred a` wieder +"auspackt". Definieren Sie > unPred :: Pred a -> (a -> Bool) > unPred = _unPred -Da Haskell-Funktionen aber "gecurried" sind, können sie die Klammern -hinten in der Signatur auch weglassen und erhalten -`unPred :: Pred a -> a -> Bool`, was man zugleich als "wende `Pred a` -an, wenn du ein `a` bekommst" lesen kann. In der Tat sind beide -Funktionen identisch (wieso?). +Da Haskell-Funktionen aber "gecurried" sind (mehr dazu in der +Vorlesung), können Sie die Klammern hinten in der Signatur auch +weglassen und erhalten `unPred :: Pred a -> a -> Bool`, was man zugleich +als "wende `Pred a` an, wenn du ein `a` bekommst" lesen kann. In der Tat +sind beide Funktionen identisch (wieso?). Bonus -Was für eine Funktion bräuchten sie um ein `Pred a` in ein `Pred b` -umzuwandeln? Können sie diese Implementieren? +Was für eine Funktion bräuchten Sie um ein `Pred a` in ein `Pred b` +umzuwandeln? Können Sie diese implementieren? > mapPred :: _fun -> Pred a -> Pred b > mapPred = _mapPred @@ -79,26 +78,26 @@ Neue Typen erfinden ------------------- In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden -von eigenen Datentypen. Zur Erinnerung; es gibt 2 Möglichkeiten, die man -miteinander kombinieren kann: `data Prod a b c = Prod a b c` benötigt -sowohl `a`, `b` als auch `c` um einen Wert zu erzeugen, -`data Sum a b = Sum1 a | Sum2 b` braucht entweder ein `a` um durch den -Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder ein `b` um durch den -Konstruktor `Sum2` ein `Sum a b` zu erzeugen. +von eigenen Datentypen. Zur Erinnerung; es gibt zwei Möglichkeiten, die +man miteinander kombinieren kann: `data Prod a b c = Prod a b c` +(Produkttyp) benötigt sowohl `a`, `b` als auch `c` um einen Wert zu +erzeugen, `data Sum a b = Sum1 a | Sum2 b` (Summentyp) braucht entweder +ein `a` um durch den Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder +ein `b` um durch den Konstruktor `Sum2` ein `Sum a b` zu erzeugen. -Definieren sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren -besitzt: Einen Konstruktor, der durch ein `a` ein `Vielleicht a` +Definieren Sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren +besitzt: Einen Konstruktor, mit dem durch ein `a` ein `Vielleicht a` konstruiert wird und ein zweiter Konstruktor, der keinen Wert nimmt, sondern die "Abwesenheit eines `a`" symbolisieren soll. > data Vielleicht a = Exercise -Können sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn -ja, implementieren sie diese; wenn nein, geben sie eine kurze +Können Sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn +ja, implementieren Sie diese; wenn nein, geben Sie eine kurze Begründung. -Wie würden sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein -`Vielleicht b` wandeln? Implementieren sie +Wie würden Sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein +`Vielleicht b` wandeln? Implementieren Sie > mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b > mapVielleicht = _mapVielleicht @@ -107,6 +106,4 @@ Bonus Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der Unterschied zwischen einem `Pred (Vielleicht a)` und einem -`Vielleicht (Pred a)`? Oder sind diese Identisch? - -> main = putStrLn "compiles" +`Vielleicht (Pred a)`? Oder sind diese identisch? diff --git a/Übungen/Blatt1.pdf b/Übungen/Blatt1.pdf index 21719ae5da054c1ca967a2217c688a97fce2442f..20c923d640e509f3eae9832ec31892d530a0d9b8 100644 GIT binary patch delta 6041 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 delta 5903 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