像我以前一样写下答案刚才,我遇到了一个有趣的问题:
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)
问题是,我想要gender $ Skirt foo
总是评估Female
(不管foo
,这是一个Age
)。我可以想出几种方法来实现这一点,但它们要求我要么
- 使用智能构造函数,理论上允许
Skirt Male foo
但不暴露构造函数
- 定义我自己的
gender
功能
对于#1,通过不在模块中公开构造函数,我有效地防止了模块的用户利用记录语法。对于#2,我必须完全放弃记录语法,或者定义一个附加函数gender'
,这再次击败了记录语法。
有没有一种方法既可以利用记录语法,又可以为我的构造函数之一提供“默认”、不可更改的值?我也对非记录语法解决方案持开放态度(也许是镜头?),只要它们同样优雅(或更优雅)。
有没有一种方法既可以利用记录语法,又可以为我的构造函数之一提供“默认”、不可更改的值?
在没有令人信服的反例的情况下,答案似乎是否定的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)