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
).我可以想到几种方法来实现这一目标,但它们要求我
Skirt Male foo
但不暴露构造函数gender
功能对于#1,通过不暴露模块中的构造函数,我有效地阻止了模块的用户利用记录语法.对于#2,我必须完全放弃记录语法,或者定义一个额外的函数gender'
,这再次击败了记录语法.
有没有办法既利用记录语法,又为我的一个构造函数提供"默认",不可更改的值?我也愿意接受非唱片语法解决方案(镜头,也许?),只要它们同样优雅(或更多).