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

use constructores inteligentes, teóricamente permitiendoSkirt Male foo pero sin exponer Constructoresdefine mi propiagender función

Con # 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).

Respuestas a la pregunta(4)

Su respuesta a la pregunta