Supongamos que tengo un tipo de datos comohaskell: ¿hay alguna forma de generar instancias "derivadas" para tipos de datos aproximadamente tuple-isomórficos?
data D a = D a a a
y una clase de tipos
class C c ...
instance (C c1, C c2) => C (c1, c2)
Entonces, yo quiero ser capaz de escribir
data D a = D a a a deriving C
y tienen que generar una instancia,
instance C ((a, a), a) => C (D a)
mediante el isomorfismo módulo-lazy-evaluación,
D a ~ ((a, a), a)
Nota. Usar un newtype y GeneralizedNewtypeDeriving
no funcionará si, por ejemplo, uno tiene data D m = D (m Integer) (m Integer)
.
Nota 2. Esta pregunta tiene relevancia para la expresividad de Haskell en general: los lenguajes como Python tienen algo llamado tuplas con nombre, que se pueden usar en cualquier lugar donde se usen las tuplas; esta pregunta muestra dónde/cómo no sé cómo emular lo mismo en Haskell.
Actualizado mi respuesta para evitar la clase de ayuda; ver http://article.gmane.org/gmane.comp.lang.haskell.cafe/97079 – reinerp