GHC tiene algunos indicadores de idioma, como DeriveFunctor
, DeriveDataTypeable
etc., que permiten la generación de compiladores de instancias derivadas para clases de tipos distintas a las permitidas en Haskell 98. Esto tiene sentido especialmente para algo como Functor
, donde las leyes de esa clase dictar una instancia obvia, derivada "natural".¿Por qué GHC no puede derivar instancias para Monoid?
¿Por qué no para Monoid
? Parece que para cualquier tipo de datos con un solo constructor de datos:
data T = MkT a b c ...
se podría producir mecánicamente una instancia Monoid
(con perdón del pseudocódigo):
instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where
mempty =
MkT mempty mempty mempty ...
mappend (MkT a1 b1 c1 ...) (MkT a2 b2 c2 ...) =
MkT (mappend a1 a2) (mappend b1 b2) (mappend c1 c2) ...
Soy consciente de que el paquete de deriveprovides this, pero mi pregunta específica es si hay una razón por la cual GHC no lo hace.
@sdcvvc: Parece una respuesta válida a la pregunta. Tal vez deberías publicarlo como tal? –
OK, hice una respuesta. – sdcvvc
Por lo general, solo hay una manera sensata de hacer una instancia de 'Functor'. Lo mismo no es cierto sobre 'Monoid'. – augustss