alor predeterminado de sintaxis de @Record para el descriptor de acceso
Como yo eraescribiendo una respuesta justo ahora, me encontré con un problema interesante:
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)
Supongo que deseo escribir el tipo de datos final con sintaxis de registro:
data Clothing = Pants {gender :: Gender, age :: Age}
| Shirt {gender :: Gender, age :: Age}
| Skirt {age :: Age}
deriving (Show, Eq)
El problema es que quierogender $ Skirt foo
para evaluar siempre aFemale
(a pesar defoo
, que es unaAge
). Se me ocurren algunas maneras de lograr esto, pero requieren que yo
Skirt Male foo
pero sin exponer Constructoresdefine mi propiagender
funciónCon # 1, al no exponer el constructor en el módulo, evito efectivamente que los usuarios del módulo aprovechen la sintaxis de registro. Con el n. ° 2, tengo que renunciar por completo a la sintaxis de grabación o definir una función adicionalgender'
, que nuevamente derrota la sintaxis de registro.
¿Hay alguna manera de aprovechar la sintaxis de registro y también proporcionar un valor "predeterminado" e inmutable para uno de mis constructores? También estoy abierto a soluciones de sintaxis sin registro (¿lentes, tal vez?) Siempre que sean tan elegantes (o más).