Да, между типами и данными существует напряженность ... которая, кстати, показывает, насколько тонка линия.
Практический ответ - использовать экземпляр по умолчанию, как указано в Haskell Wiki .Он точно отвечает на ваш точный вопрос, так как вы должны отказаться от прямого использования конструктора.
Таким образом, для вашего примера,
data Age = Baby | Child | PreTeen | Adult | NoAge
data Clothing = Pants {gender :: Gender, age :: Age}
| Shirt {gender :: Gender, age :: Age}
| Skirt {gender :: Gender, age :: Age}
deriving (Show, Eq)
skirt = Skirt { gender=Female, age=NoAge }
, тогда разработчики могут создавать новые экземпляры со значениями по умолчанию, используя copy-andсредство обновления записи с синтаксисом записи
newSkirt = skirt { age=Adult }
и gender newSkirt
оценивается как Female
Я хочу подчеркнуть, что этот подход приводит к тому, что вы определяете значения по умолчанию на уровне типа, которыйЯ думаю, что это хорошо (конечно, конструктор NoAge
- это Nothing
типа Maybe Age
).