Comencé esta nueva pregunta porque se convirtió en un seguimiento de mi pregunta anterior.Uso de tipos de datos en Haskell
Si tengo dos tipos de datos que se componen de constructores similares:
data A = X | Y | Z
data B = X | Y
¿No hay manera alguna manera puedo representar esto como:
data A = C | Z
data B = C
data C = X | Y
si se puede ver lo que estoy haciendo - Estoy tratando de agrupar el X | Y en un tipo de datos, que luego puede ser utilizado por muchos otros tipos de datos. Parece que no puedo obtener el compilador para permitir esto, o si lo hace, no puedo hacer coincidir patrones con X o Y, solo con C?
Aparece el mensaje de error que C ha sido declarado varias veces.
Pensé que podría usar tipos, pero no permiten el uso de varias tipificaciones.
EDITAR
Incluso si declaro el camino más largo (como abajo), todavía no se compilará y dice que X e Y tienen múltiples declaraciones:
data A = X | Y | Z
data B = X | Y
Lo que están pidiendo sería un subtipo de 'A '. No se declararía con la palabra clave 'data', que crea un nuevo tipo, disjunta de los tipos existentes anteriores. No creo que Haskell tenga esa característica, pero no estoy al tanto de todas las extensiones de Haskell. – Gilles
@Gilles: No, Haskell no tiene ningún polimorfismo de subtipo. Solo tiene polimorfismo paramétrico y polimorfismo ad-hoc a través de clases de tipos. Lo más cercano que puedes obtener es un tipo existencial, pero eso es casi, pero no del todo, una cosa completamente diferente. –
Me gustaría poner esto como una respuesta, pero porque no es del todo ... Es posible que pueda acercarse a lo que desea al declarar una clase de tipo y luego las operaciones que necesita para esas "cosas comunes". Esta es una forma bastante común de cambiar las cosas para resolver (una versión de) este problema. –