Как деривация работает в Haskell?

Алгебраические типы данных (ADT) в Haskell могут автоматически становиться экземплярами некоторых классов типов (напримерShow,Eq), производя их от них. data Maybe a = Nothing | Just a deriving (Eq, Ord) У меня вопрос: как это derivingработает, т.е. как Haskell знает, как реализовать функции...