Запишите значение синтаксиса по умолчанию для средства доступа

Как я былписать ответ только сейчас наткнулся на интересную проблему:

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)

Предположим, я хочу написать окончательный тип данных с синтаксисом записи:

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

Проблема в том, что я хочуgender $ Skirt foo всегда оцениватьFemale (невзирая наfoo, который являетсяAge). Я могу придумать несколько способов сделать это, но они требуют, чтобы я либо

использовать умные конструкторы, теоретически позволяющиеSkirt Male foo но не выставляя Конструкторыопределить мой собственныйgender функция

С # 1, не раскрывая конструктор в модуле, я эффективно запрещаю пользователям модуля использовать преимущества синтаксиса записей. С # 2 я должен полностью отказаться от синтаксиса записи или определить дополнительную функциюgender', который снова побеждает синтаксис записи.

Есть ли способ использовать преимущества синтаксиса записи, а также предоставить неизменяемое значение по умолчанию для одного из моих конструкторов? Я открыт для решений без синтаксиса записей (линзы, может быть?), Если они такие же элегантные (или более того).

Ответы на вопрос(2)

Ваш ответ на вопрос