记录访问者的语法默认值

Dan*_*ton 9 haskell record default-value

在我刚刚写完答案的时候,我遇到了一个有趣的问题:

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)
Run Code Online (Sandbox Code Playgroud)

假设我希望用记录语法编写最终数据类型:

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

问题是,我想gender $ Skirt foo总是评价Female(不管是foo哪一个Age).我可以想到几种方法来实现这一目标,但它们要求我

  1. 使用智能构造函数,理论上允许Skirt Male foo但不暴露构造函数
  2. 定义我自己的gender功能

对于#1,通过不暴露模块中的构造函数,我有效地阻止了模块的用户利用记录语法.对于#2,我必须完全放弃记录语法,或者定义一个额外的函数gender',这再次击败了记录语法.

有没有办法既利用记录语法,又为我的一个构造函数提供"默认",不可更改的值?我也愿意接受非唱片语法解决方案(镜头,也许?),只要它们同样优雅(或更多).

Dan*_*ton 0

有没有一种方法既可以利用记录语法,又可以为我的构造函数之一提供“默认”、不可更改的值?

在没有令人信服的反例的情况下,答案似乎是否定的。