Mentre ero writing up an answer poco fa, mi sono imbattuto in un problema interessante:Record valore di sintassi predefinita per di accesso
data Gender = Male | Female
deriving (Eq, Show)
data Age = Baby | Child | PreTeen | Adult
deriving (Eq, Show, Ord)
data Clothing = Pants Gender Age
| Shirt Gender Age
| Skirt Age -- assumed to be Female
deriving (Show, Eq)
Supponiamo che desidero scrivere il tipo di dati finale con la sintassi di registrazione:
data Clothing = Pants {gender :: Gender, age :: Age}
| Shirt {gender :: Gender, age :: Age}
| Skirt {age :: Age}
deriving (Show, Eq)
Il problema è che voglio sempre valutare Female
Female
(indipendentemente da foo
, che è un Age
). Mi vengono in mente un paio di modi per ottenere questo, ma richiedono che io sia costruttori intelligenti
- uso, in teoria permettere
Skirt Male foo
ma non esporre Costruttori - definire la mia
gender
funzione
Con # 1, non esponendo il costruttore nel modulo, impedisco effettivamente agli utenti del modulo di sfruttare la sintassi dei record. Con # 2, devo assolutamente rinunciare alla sintassi del record, o definire una funzione aggiuntiva gender'
, che di nuovo sconfigge la sintassi del record.
Esiste un modo per trarre vantaggio dalla sintassi dei record e fornire anche un valore "predefinito", immutabile per uno dei miei costruttori? Sono aperto anche a soluzioni per la sintassi non-record (le lenti, forse?) Purché siano altrettanto eleganti (o più).
Un obiettivo normale non funzionerebbe, dal momento che è possibile assegnare il campo 'gender' con due dei costruttori, ma non l'altro. Penso che farlo sia una cattiva idea; se 'pippo' è un accessorio di registrazione, e' pippo x' funziona, allora anche 'x {pippo = y}' dovrebbe. – ehird
Di solito vado con 2. – augustss
Come aggiungere una funzione 'gender'' (o potrei chiamarla' totalGender' o 'safeGender' o giù di lì) sconfiggere la sintassi del record? –