Ho iniziato questa nuova domanda poiché è diventata un seguito dalla mia precedente domanda.Utilizzo dei tipi di dati in Haskell
Se ho due tipi di dati che sono composti da costruttori simili:
data A = X | Y | Z
data B = X | Y
c'è nessun modo posso in qualche modo rappresentare questo come:
data A = C | Z
data B = C
data C = X | Y
se si può vedere quello che sto facendo - Sto cercando di raggruppare X | Y in un tipo di dati, che può quindi essere utilizzato da più altri tipi di dati. Non riesco a ottenere il compilatore per consentire questo, o se lo fa, non posso pattern-match contro la X o Y, solo la C ??
Viene visualizzato il messaggio di errore che C è stato dichiarato più volte.
Ho pensato che potrei forse usare i tipi, ma non consentono più tipi di battitura.
EDIT
Anche se dichiaro la via più lunga (come qui di seguito), ma ancora non compilerà e dice X e Y hanno più dichiarazioni:
data A = X | Y | Z
data B = X | Y
Quello che stai chiedendo sarebbe un sottotipo di 'A '. Non verrebbe dichiarato con la parola chiave 'data', che crea un nuovo tipo, disgiunto dai precedenti tipi esistenti. Non penso che Haskell abbia una tale caratteristica, ma non sono al corrente con tutte le estensioni Haskell. – Gilles
@Gilles: No, Haskell non ha alcun polimorfismo di sottotipo. Ha solo polimorfismo parametrico e polimorfismo ad-hoc attraverso classi di tipi. La cosa più vicina che puoi ottenere è un tipo esistenziale, ma è quasi, ma non del tutto, una cosa completamente diversa. –
Lo metterei come risposta, ma perché non è del tutto ... Potresti essere in grado di avvicinarti a ciò che vuoi dichiarando una classe di caratteri e quindi le operazioni che ti servono per quelle "cose comuni". Questo è un modo abbastanza comune per capovolgere le cose per risolvere (una versione di) questo problema .. –