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