Los tipos de datos algebraicos (ADT) en Haskell pueden convertirse automáticamente en instancias de algunos tipos de clases (comoShow,Eq) derivando de ellos.
data  Maybe a  =  Nothing | Just a
  deriving (Eq, Ord)Mi pregunta es, ¿cómo funciona esto deriving , es decir, cómo sabe Haskell cómo implementar las funciones de la clase de tipos derivada para el ADT derivado?
Además, ¿por qué está derivingrestringido a determinadas clases de tipos? ¿Por qué no puedo escribir mi propia clase de tipos que pueda derivarse?
fuente

StandaloneDerivingen el manual de ghc y haskellwikiDel informe Haskell 98:
Aquí está la descripción de cómo derivar estas clases de tipos: http://www.haskell.org/onlinereport/derived.html#derived-appendix
fuente
Es posible utilizar Template Haskell para generar declaraciones de instancia de una manera similar a las cláusulas derivadas.
El siguiente ejemplo fue robado descaradamente de la Wiki de Haskell :
fuente