Supponiamo di avere una buona definizione induttiva e di definirla come un tipo di dati in Haskell. Tuttavia, la tua definizione induttiva è (come molte definizioni induttive sono) di una tale forma che le regole generatrici richiedono che le loro "premesse" abbiano una certa struttura. Per esempio, supponiamo di avere la seguente definizione:Limitazione dei tipi di dati
- se
x
è un intero pari, poiT x
è un'arma, - se
x
è un intero dispari, quindiS x
è un'arma.
Se voglio definire questo (come un unico) tipo di dati in Haskell, vorrei scrivere qualcosa di simile
data Weapon = T Int | S Int
Ovviamente, questo non funzionerà come è ora possibile generare T 5
e S 4
, per esempio. Esiste un modo naturale per passare delle restrizioni sugli argomenti del costruttore, in modo che io possa scrivere qualcosa di simile al codice precedente che darebbe la definizione corretta?
Costruttori intelligenti, soprattutto.Vieta di usare direttamente 'T' e' S' e crei le funzioni 'newT' e' newS' che verificano i numeri passati. –