J'ai commencé cette nouvelle question car elle est devenue une suite de ma question précédente.Utilisation de types de données dans Haskell
Si j'ai deux types de données qui sont composés de constructeurs similaires:
data A = X | Y | Z
data B = X | Y
est-il pas moyen que je peux en quelque sorte représenter cela comme:
data A = C | Z
data B = C
data C = X | Y
si vous pouvez voir ce que je fais - J'essaie de grouper les X | Y en un type de données, qui peut ensuite être utilisé par plusieurs autres types de données. Je ne peux pas sembler obtenir le compilateur pour permettre cela, ou si c'est le cas, je ne peux pas faire correspondre le modèle contre le X ou Y, seulement le C ??
Je reçois le message d'erreur que C a été déclaré plusieurs fois.
Je pensais que je pourrais peut-être utiliser des types, mais ils ne permettent pas plusieurs typages.
EDIT
Même si je déclare le long chemin (comme ci-dessous), elle ne sera pas compiler et dit X et Y ont plusieurs déclarations:
data A = X | Y | Z
data B = X | Y
Qu'est-ce que vous demandez serait un sous-type de 'A '. Il ne serait pas déclaré avec le mot clé 'data', qui crée un nouveau type, disjoint des types existants antérieurs. Je ne pense pas que Haskell ait une telle fonctionnalité, mais je ne suis pas au courant de toutes les extensions Haskell. – Gilles
@Gilles: Non, Haskell n'a aucun polymorphisme de sous-type. Il a seulement un polymorphisme paramétrique, et un polymorphisme ad-hoc à travers les classes de types. La chose la plus proche que vous pouvez obtenir est un type existentiel, mais c'est presque, mais pas tout à fait, une chose entièrement différente. –
Je mettrais cela comme une réponse, mais parce que ce n'est pas tout à fait .. Vous pouvez être en mesure de se rapprocher de ce que vous voulez en déclarant une classe de type et ensuite les opérations dont vous avez besoin pour ces "choses courantes". C'est un moyen assez commun de retourner les choses pour résoudre (une version de) ce problème .. –