migrated changes to all other files

This commit is contained in:
Nicole Dresselhaus 2016-04-17 18:13:24 +02:00
parent b701278f87
commit 7ddcd77b36
3 changed files with 82 additions and 72 deletions

View File

@ -5,7 +5,7 @@
Typtheorie 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? Funktionen. Wozu könnte `fun2` nützlich sein?
-} -}
@ -18,61 +18,71 @@ fun2 = _fun2
fun3 :: (Eq a) => a -> a -> Bool fun3 :: (Eq a) => a -> a -> Bool
fun3 = _fun3 fun3 = _fun3
{- Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der {-
simpelste hiervon ist `Identity`, der genau gar nichts macht, sondern Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der
nur einen anderen Typen einpackt.-} simpelste hiervon ist `Identity`, der nur einen anderen Typen einpackt.
-}
data Identity a = Identity a data Identity a = Identity a
{- Diese Definition stellt uns automatisch den Konstruktor {- Diese Definition stellt uns automatisch den Konstruktor
`Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt. `Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt.
Schreiben sie die Funktion -} Schreiben Sie die Funktion
-}
unIdentity :: Identity a -> a unIdentity :: Identity a -> a
unIdentity = _unIdentity 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 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` Funktion mit dem Typen `a -> b`. Wie wenden Sie diese auf das `a`
"innerhalb" des `Identity` an um ein `Identity b` herzustellen? "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 :: (a -> b) -> Identity a -> Identity b
mapIdentity = _mapIdentity 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 Funktionen sind auch nur Typen
------------------------------ ------------------------------
Datentypen können auch Funktionen enthalten. Sehen sie sich einmal den Datentypen können auch Funktionen enthalten. Sehen Sie sich einmal den
Datentypen-} Datentypen
-}
data Pred a = Pred (a -> Bool) 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 `a`) eine Funktion gespeichert hat, die `a` in einen `Bool` umwandeln
kann (etwa um irgendwas zu filtern/selektieren/löschen/..., wenn man kann (etwa um irgendwas zu filtern/selektieren/löschen/..., wenn man
dies an eine weitere Funktion übergibt). dies an eine weitere Funktion übergibt).
Auch hier können sei eine Funktion schreiben, die das `Pred a` wieder Auch hier können Sie eine Funktion schreiben, die das `Pred a` wieder
"auspackt". Definieren sie-} "auspackt". Definieren Sie
-}
unPred :: Pred a -> (a -> Bool) unPred :: Pred a -> (a -> Bool)
unPred = _unPred unPred = _unPred
{- Da Haskell-Funktionen aber "gecurried" sind, können sie die Klammern {-
hinten in der Signatur auch weglassen und erhalten Da Haskell-Funktionen aber "gecurried" sind (mehr dazu in der
`unPred :: Pred a -> a -> Bool`, was man zugleich als "wende `Pred a` Vorlesung), können Sie die Klammern hinten in der Signatur auch
an, wenn du ein `a` bekommst" lesen kann. In der Tat sind beide weglassen und erhalten `unPred :: Pred a -> a -> Bool`, was man zugleich
Funktionen identisch (wieso?). als "wende `Pred a` an, wenn du ein `a` bekommst" lesen kann. In der Tat
sind beide Funktionen identisch (wieso?).
Bonus Bonus
Was für eine Funktion bräuchten sie um ein `Pred a` in ein `Pred b` Was für eine Funktion bräuchten Sie um ein `Pred a` in ein `Pred b`
umzuwandeln? Können sie diese Implementieren?-} umzuwandeln? Können Sie diese implementieren?
-}
mapPred :: _fun -> Pred a -> Pred b mapPred :: _fun -> Pred a -> Pred b
mapPred = _mapPred mapPred = _mapPred
@ -82,26 +92,29 @@ Neue Typen erfinden
------------------- -------------------
In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden
von eigenen Datentypen. Zur Erinnerung; es gibt 2 Möglichkeiten, die man von eigenen Datentypen. Zur Erinnerung; es gibt zwei Möglichkeiten, die
miteinander kombinieren kann: `data Prod a b c = Prod a b c` benötigt man miteinander kombinieren kann: `data Prod a b c = Prod a b c`
sowohl `a`, `b` als auch `c` um einen Wert zu erzeugen, (Produkttyp) benötigt sowohl `a`, `b` als auch `c` um einen Wert zu
`data Sum a b = Sum1 a | Sum2 b` braucht entweder ein `a` um durch den erzeugen, `data Sum a b = Sum1 a | Sum2 b` (Summentyp) braucht entweder
Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder ein `b` um durch den ein `a` um durch den Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder
Konstruktor `Sum2` ein `Sum a b` zu erzeugen. ein `b` um durch den Konstruktor `Sum2` ein `Sum a b` zu erzeugen.
Definieren sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren Definieren Sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren
besitzt: Einen Konstruktor, der durch ein `a` ein `Vielleicht a` besitzt: Einen Konstruktor, mit dem durch ein `a` ein `Vielleicht a`
konstruiert wird und ein zweiter Konstruktor, der keinen Wert nimmt, 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 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. Begründung.
Wie würden sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein Wie würden Sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein
`Vielleicht b` wandeln? Implementieren sie-} `Vielleicht b` wandeln? Implementieren Sie
-}
mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b
mapVielleicht = _mapVielleicht mapVielleicht = _mapVielleicht
@ -111,5 +124,5 @@ Bonus
Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der
Unterschied zwischen einem `Pred (Vielleicht a)` und einem Unterschied zwischen einem `Pred (Vielleicht a)` und einem
`Vielleicht (Pred a)`? Oder sind diese Identisch? `Vielleicht (Pred a)`? Oder sind diese identisch?
-} -}

View File

@ -4,7 +4,7 @@
Typtheorie 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? Funktionen. Wozu könnte `fun2` nützlich sein?
> fun1 :: a -> a > fun1 :: a -> a
@ -17,36 +17,35 @@ Funktionen. Wozu könnte `fun2` nützlich sein?
> fun3 = _fun3 > fun3 = _fun3
Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der Wir haben in der Vorlesung parametrisierte Typen kennengelernt. Der
simpelste hiervon ist `Identity`, der genau gar nichts macht, sondern simpelste hiervon ist `Identity`, der nur einen anderen Typen einpackt.
nur einen anderen Typen einpackt.
> data Identity a = Identity a > data Identity a = Identity a
Diese Definition stellt uns automatisch den Konstruktor Diese Definition stellt uns automatisch den Konstruktor
`Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt. `Identity :: a -> Identity a` zur Verfügung, der ein `a` einpackt.
Schreiben sie die Funktion Schreiben Sie die Funktion
> unIdentity :: Identity a -> a > unIdentity :: Identity a -> a
> unIdentity = _unIdentity > 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 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` Funktion mit dem Typen `a -> b`. Wie wenden Sie diese auf das `a`
"innerhalb" des `Identity` an um ein `Identity b` herzustellen? "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 :: (a -> b) -> Identity a -> Identity b
> mapIdentity = _mapIdentity > mapIdentity = _mapIdentity
**Hinweis:** Es gibt *zwei* prinzipielle Vorgehen dieses zu **Hinweis:** Es gibt *zwei* prinzipielle Vorgehen dieses zu
implementieren. Kommen sie auf beide? implementieren. Kommen Sie auf beide?
Funktionen sind auch nur Typen Funktionen sind auch nur Typen
------------------------------ ------------------------------
Datentypen können auch Funktionen enthalten. Sehen sie sich einmal den Datentypen können auch Funktionen enthalten. Sehen Sie sich einmal den
Datentype Datentypen
> data Pred a = Pred (a -> Bool) > 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 kann (etwa um irgendwas zu filtern/selektieren/löschen/..., wenn man
dies an eine weitere Funktion übergibt). dies an eine weitere Funktion übergibt).
Auch hier können sei eine Funktion schreiben, die das `Pred a` wieder Auch hier können Sie eine Funktion schreiben, die das `Pred a` wieder
"auspackt". Definieren sie "auspackt". Definieren Sie
> unPred :: Pred a -> (a -> Bool) > unPred :: Pred a -> (a -> Bool)
> unPred = _unPred > unPred = _unPred
Da Haskell-Funktionen aber "gecurried" sind, können sie die Klammern Da Haskell-Funktionen aber "gecurried" sind (mehr dazu in der
hinten in der Signatur auch weglassen und erhalten Vorlesung), können Sie die Klammern hinten in der Signatur auch
`unPred :: Pred a -> a -> Bool`, was man zugleich als "wende `Pred a` weglassen und erhalten `unPred :: Pred a -> a -> Bool`, was man zugleich
an, wenn du ein `a` bekommst" lesen kann. In der Tat sind beide als "wende `Pred a` an, wenn du ein `a` bekommst" lesen kann. In der Tat
Funktionen identisch (wieso?). sind beide Funktionen identisch (wieso?).
Bonus Bonus
Was für eine Funktion bräuchten sie um ein `Pred a` in ein `Pred b` Was für eine Funktion bräuchten Sie um ein `Pred a` in ein `Pred b`
umzuwandeln? Können sie diese Implementieren? umzuwandeln? Können Sie diese implementieren?
> mapPred :: _fun -> Pred a -> Pred b > mapPred :: _fun -> Pred a -> Pred b
> mapPred = _mapPred > mapPred = _mapPred
@ -79,26 +78,26 @@ Neue Typen erfinden
------------------- -------------------
In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden In Haskell ist ein zentraler Vorgehenspunkt das Definieren und Verwenden
von eigenen Datentypen. Zur Erinnerung; es gibt 2 Möglichkeiten, die man von eigenen Datentypen. Zur Erinnerung; es gibt zwei Möglichkeiten, die
miteinander kombinieren kann: `data Prod a b c = Prod a b c` benötigt man miteinander kombinieren kann: `data Prod a b c = Prod a b c`
sowohl `a`, `b` als auch `c` um einen Wert zu erzeugen, (Produkttyp) benötigt sowohl `a`, `b` als auch `c` um einen Wert zu
`data Sum a b = Sum1 a | Sum2 b` braucht entweder ein `a` um durch den erzeugen, `data Sum a b = Sum1 a | Sum2 b` (Summentyp) braucht entweder
Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder ein `b` um durch den ein `a` um durch den Konstruktor `Sum1` ein `Sum a b` zu erzeugen oder
Konstruktor `Sum2` ein `Sum a b` zu erzeugen. ein `b` um durch den Konstruktor `Sum2` ein `Sum a b` zu erzeugen.
Definieren sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren Definieren Sie einen Datentypen `Vielleicht a`, der zwei Konstruktoren
besitzt: Einen Konstruktor, der durch ein `a` ein `Vielleicht a` besitzt: Einen Konstruktor, mit dem durch ein `a` ein `Vielleicht a`
konstruiert wird und ein zweiter Konstruktor, der keinen Wert nimmt, 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 > data Vielleicht a = Exercise
Können sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn Können Sie hier eine Funktion schreiben, die das `a` extrahiert? Wenn
ja, implementieren sie diese; wenn nein, geben sie eine kurze ja, implementieren Sie diese; wenn nein, geben Sie eine kurze
Begründung. Begründung.
Wie würden sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein Wie würden Sie mittels einer Funktion `a -> b` ein `Vielleicht a` in ein
`Vielleicht b` wandeln? Implementieren sie `Vielleicht b` wandeln? Implementieren Sie
> mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b > mapVielleicht :: (a -> b) -> Vielleicht a -> Vielleicht b
> mapVielleicht = _mapVielleicht > mapVielleicht = _mapVielleicht
@ -107,6 +106,4 @@ Bonus
Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der Man kann Typen natürlich auch Schachteln. Worin liegt eigentlich der
Unterschied zwischen einem `Pred (Vielleicht a)` und einem Unterschied zwischen einem `Pred (Vielleicht a)` und einem
`Vielleicht (Pred a)`? Oder sind diese Identisch? `Vielleicht (Pred a)`? Oder sind diese identisch?
> main = putStrLn "compiles"

Binary file not shown.