Record valor padrão da sintaxe para o acessador

Como eu era escrevendo uma resposta agora, me deparei com um problema interessante:

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)

uponha que eu queira escrever o tipo de dados final com sintaxe de registro:

data Clothing = Pants {gender :: Gender, age :: Age}
              | Shirt {gender :: Gender, age :: Age}
              | Skirt {age :: Age}
              deriving (Show, Eq)

O problema é que eu querogender $ Skirt foo para sempre avaliar paraFemale (independentemente defoo, que é umAge). Posso pensar em algumas maneiras de conseguir isso, mas elas exigem que eu

use construtores inteligentes, permitindo teoricamenteSkirt Male foo mas não expondo construtoresdefine my owngender function

Com o número 1, por não expor o construtor no módulo, evito efetivamente que os usuários do módulo aproveitem a sintaxe do registro. Com o número 2, tenho que renunciar inteiramente à sintaxe do registro ou definir uma função adicionalgender', que novamente derrota a sintaxe do registr

Existe uma maneira de aproveitar a sintaxe do registro e também fornecer um valor "padrão" e imutável para um dos meus construtores? Também estou aberto a soluções sem sintaxe de registro (lentes, talvez?), Desde que sejam igualmente elegantes (ou mais

questionAnswers(4)

yourAnswerToTheQuestion