Когда я только что писал ответ , я столкнулся с интересной проблемой:
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)
] Проблема в том, что я хочу, чтобы пол $ Skirt foo
всегда оценивался как Женский
(независимо от foo
, то есть Возраст
) .Я могу придумать несколько способов добиться этого, но они требуют, чтобы я либо
Skirt Male foo
, но не раскрывающие конструкторы пол
function С # 1, не раскрывая конструктор в модуле, я эффективно предотвращаю использование пользователями модуля синтаксиса записи. В № 2 я должен полностью отказаться от синтаксиса записи или определить дополнительную функцию пол '
, которая снова нарушает синтаксис записи.
Есть ли способ воспользоваться преимуществами синтаксиса записи, а также предоставить неизменяемое значение по умолчанию для одного из моих конструкторов? Я также открыт для решений без записи синтаксиса (линзы, возможно?), Если они столь же элегантны (или более того).