Aufgabe: schreibe die entsprechenden Instance-Deklarationen.
Aufgabe (kein Witz!): schreibe eine falsche instance Functor [] und instance Functor Tree, d. h. eine Funktion fmap, die zwar den richtigen Typ hat, aber nicht die beiden Gleichungen für ein fmap erfüllt.
data Id a = Id a instance Functor Id where fmap f (Id x) = Id (f x)
data Null a = Null instance Functor Null where fmap f Null = NullWenn man genau hinsieht, entstehen alle Datentypen (und auch alle Funktor-Instanzen aus Kombinationen aus diesen beiden, und zwar durch Kreuzprodukt, disjunkte Summe, Funktionenraum-Bildung und Rekursion.
Leider ist Haskell nicht soweit, diese Zusammenhänge systematisch auszunutzen. Es gibt aber entsprechende Vorschläge, das heißt dann polytypic Programming (D. Swierstra, R. Hinze).
data Maybe a = Nothing | Just a instance Functor Maybe where fmap f Nothing = Nothing fmap f (Just x) = Just (f x)Maybe ist nützlich zur Kodierung von Rechnugen, die eventuell ergebnislos bleiben.
data State s a = State (s -> (a, s)) instance Functor (State s) where fmap f (State t) = State ( \ s -> let (x, s') = t s in (f x, s'))Das wird sehr bald sehr wichtig, bei Monaden. Dann sehen wir uns das genauer an.