migrated changes to all other files
This commit is contained in:
parent
b701278f87
commit
7ddcd77b36
@ -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?
|
||||||
-}
|
-}
|
||||||
|
@ -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.
Loading…
Reference in New Issue
Block a user