Jak działa wyprowadzanie w Haskell?

Algebraiczne typy danych (ADTS) w Haskell może automatycznie stają się przypadki niektóre typeclasse s (jakShow,Eq) poprzez wynikające z nich. data Maybe a = Nothing | Just a deriving (Eq, Ord) Moje pytanie brzmi: jak to derivingdziała, tj. Skąd Haskell wie, jak zaimplementować funkcje...