因此,如果您可以执行以下操作(不一定使用这种格式,只是一般的想法),那就太好了:
data Sub = SubA | SubB
data Super = Sub | SuperB
isSub :: Super -> Bool
isSub Sub = True
isSub _ = False
所以 isSub SubA 会报告 True (而不是错误。)此刻你可能会做类似的事情:
data Super = SubA | SubB | SuperB
isSub :: Super -> Bool
isSub SubA = True
isSub SubB = True
isSub _ = False
它并不可怕或任何东西,但它不能很好地扩展(就像 Sub 到 SubZ 时这将非常笨重)并且它不允许您将 Sub 类型添加到它们自己的类型类中。为避免该问题,您可以包装 Sub:
data Sub = SubA | SubB
data Super = SuperA Sub | SuperB
isSub :: Super -> Bool
isSub (SuperA _) = True
isSub _ = False
但是现在您必须确保将您的 Subs 包装起来以将它们用作 Super... 再次不可怕;只是并没有真正表达出我想要的语义(即 Super 可以是任何 Sub 或 SuperB)。第一个(合法)示例是“Super 可以是 SubA...”,第二个是“Super 可以是带有 Sub...的 SuperA”
EDTI:更改一些名称以避免与音乐内容混为一谈。
PS 从技术上讲,这开始于我在考虑如何在 Haskell 中表示 Scheme 的数字塔......但我真的对表示“Type1 可以是 Type2 加 x、y、...... )