Como a derivação funciona em Haskell?

Algebraic Tipos de dados (ADTs) em Haskell podem se tornar instâncias de algunstypeclasses (comoShow, Eq) porderivado deles.

data  Maybe a  =  Nothing | Just a
  deriving (Eq, Ord)

Minha pergunta é: como issoderiving trabalho, ou seja, como Haskell sabe como implementar as funções da classe de tipo derivada para o ADT derivado?

Além disso, por que éderiving restrito apenas a certas classes? Por que não consigo escrever minha própria classe de letra que pode ser derivada?

questionAnswers(3)

yourAnswerToTheQuestion