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

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

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 , то есть Возраст ) .Я могу придумать несколько способов добиться этого, но они требуют, чтобы я либо

  1. использовал интеллектуальные конструкторы, теоретически позволяющие Skirt Male foo , но не раскрывающие конструкторы
  2. , определять мой собственный пол function

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

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

9
задан Community 23 May 2017 в 02:28
поделиться