Eine polymorphe Funktion f :: c a -> d a (wobei c und d Typkonstruktoren sind) ist eine natürliche Transformation vom Funktor c zum Funktor d. Beispiel: flatten :: Tree a -> [a] Dann gilt
f . fmap g = fmap g . fAuf die Typen aufpassen: es sind zwei verschiedene fmaps. Beispiel: flatten . tmap (+1) = map (+1) . flatten
Das läuft unter dem Slogan Theorems for Free (für umsonst), denn die Aussage gilt, sobald f wirklich den polymorphen Typ hat, und das kann ja der Compiler für uns feststellen. Wir selbst stecken also keinerlei Arbeit rein.