home Funktionale Programmierung: Funktoren Prof. Dr. Uwe Schmidt FH Wedel

Funktoren

weiter

weiter

Typklassen für Typkonstruktoren

Literatur
weiter
Typklassen
beschreiben gemeinsame Schnittstellen für mehrere Typen
weiter
Beispiel
class Eq a where
  == :: a -> a -> Bool
  /= :: a -> a -> Bool
 
  x /= y == not (x == y)
 
instance Eq Bool where
  x == y = ...
 
instance Eq Int where
  x == y = ...
 
instance Eq a => Eq [a] where
  x == y = ...
weiter
merke
Gleiche Eigenschaften verschiedener Typen zusammengefasst.
weiter
?
Gibt es auch gleiche Eigenschaften (Operationen) für verschiedene Typkonstruktoren
Beispiele
für einstellige Typkonstruktoren (Konstruktoren mit einem Typparameter)
 
Maybe .
[.]
(String, .)
Either String .
 
data Tree a
   = Null
   | Tip a
   | Bin (Tree a) (Tree a)
 
data Tree2 a
  = Empty
  | Node (Tree2 a) a (Tree2 a)
 
String -> .
weiter
?
Welche Eigenschaften für verschiedene Typkonstruktoren kommen wiederholt vor?
1. Beispiel
[a]
map :: (a -> b) -> ([a] -> [b])
map f []       = []
map f (x : xs) = f x : map f xs
weiter
2. Beispiel
Maybe a
mapMaybe :: (a -> b) -> (Maybe a -> Maybe b)
mapMaybe f Nothing  = Nothing
mapMaybe f (Just x) = Just (f x)
weiter
3. Beispiel
(String, a)
mapSnd :: (a -> b) -> (String, a) -> (String, b)
mapSnd f (x, y) = (x, f y)
weiter
4. Beispiel
Either String a
mapEither :: (a -> b) -> (Either String a -> Either String b)
mapEither f (Left s)  = Left s
mapEither f (Right x) = Right (f x)
weiter
5. Beispiel
Tree2 a
data Tree2 a
  = Empty
  | Node (Tree2 a) a (Tree2 a)
 
mapTree2 :: (a -> b) -> (Tree2 a -> Tree2 b)
mapTree2 f Empty  = Empty
mapTree2 f (Node l x r) = Node (mapTree2 f l) (f x) (mapTree2 f r)
weiter
?
6. Beispiel: Tree a?
weiter
?
7. Beispiel: String -> a?
Wunsch
nicht map, mapMaybe, mapSnd, mapEither, mapTree, mapTree2, mapFct
sondern Überladen eines Bezeichner fmap
merke
Eine Typklasse für Typkonstruktoren
Lösung
Funktoren
Definition
class Functor f where
  fmap :: (a -> b) -> (f a -> f b)
weiter
merke
Die Variable f steht für einen Typkonstruktor mit einem Typ-Parameter, nicht für einen einfachen Typ.
Instanzen
für die Beispiele
[]
instance Functor [] where
  fmap = map
weiter
Maybe
instance Functor Maybe where
  fmap f Nothing  = Nothing
  fmap f (Just x) = Just (f x)
weiter
(,) String
instance Functor ((,) String) where
  fmap f (x, y) = (x, f y)
weiter
Either String
instance Functor (Either String) where
  fmap f (Left s)  = Left s
  fmap f (Right x) = Right (f x)
weiter
Tree2
instance Functor Tree2 where
  fmap f Empty  = Empty
  fmap f (Node l x r) = Node (fmap f l) (f x) (fmap f r)
weiter
?
Tree?
weiter
?
String ->, Funktionen mit Argument vom Typ String?
weiter
?
r ->, beliebige Funktionen?
weiter
?
Gesetze für fmap?
weiter
?
Wer stellt diese Gesetze sicher?
gut
Viele weitere Strukturen sind Funktoren.
gut
Jede Monade ( -> Monaden) ist auch ein Funktor.

Letzte Änderung: 23.09.2019
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel