Запишите значение синтаксиса по умолчанию для средства доступа
Как я былписать ответ только сейчас наткнулся на интересную проблему:
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'
, который снова побеждает синтаксис записи.
Есть ли способ использовать преимущества синтаксиса записи, а также предоставить неизменяемое значение по умолчанию для одного из моих конструкторов? Я открыт для решений без синтаксиса записей (линзы, может быть?), Если они такие же элегантные (или более того).