Vorlesung: Praxis der Funktionalen Programmierung


Weitere Funktoren

Wir haben schon Listen und Bäume mit Schlüsseln in Knoten als Funktoren erkannt. Auch die anderen beiden Baumkonstruktoren (Schlüssel in Blättern, Rose Trees) sind Funktoren.

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.

Id

data Id a = Id a
instance Functor Id where fmap f (Id x) = Id (f x)

Null

data Null a = Null
instance Functor Null where fmap f Null = Null
Wenn 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).

Maybe

(disjunkte Summe von Null und Id)
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.

Zustands-Transformer

Ein State Transformer ist eine Funktion von einem Zustandstyp zu einem Paar aus Resultat und neuem Zustandstyp.
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.

best viewed with any browser


http://www.informatik.uni-leipzig.de/~joe/ mailto:joe@informatik.uni-leipzig.de