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
Skirt 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