那么,什么将是很好的,如果你可以做类似下面的(不一定是这种格式,只是一般的想法):嵌套/分数据类型
data Sub = SubA | SubB
data Super = Sub | SuperB
isSub :: Super -> Bool
isSub Sub = True
isSub _ = False
所以isSub苏巴将报告真(而不是一个错误。) 在你可能会做这样的事情的时刻:
data Super = SubA | SubB | SuperB
isSub :: Super -> Bool
isSub SubA = True
isSub SubB = True
isSub _ = False
它不可怕或任何东西,但它不能很好地扩展(如如果子最多时SubZ这将是可怕的笨重),它不允许你将Sub类型添加到它们自己的type-cl中屁股。为了避免这个问题,你可以用子:
data Sub = SubA | SubB
data Super = SuperA Sub | SuperB
isSub :: Super -> Bool
isSub (SuperA _) = True
isSub _ = False
但现在你必须确保你的包裹替补使用他们作为一个超级......再也不可怕;只是没有真正表达我想要的语义(即Super可以是任何Sub或SuperB)。第一个(合法的)例子是“Super可以是SubA ...”,第二个是“Super可以是SuperA,需要Sub ...”
EDTI:更改一些名称以避免与音乐内容混淆。
P.S.从技术上讲,当我开始思考如何在Haskell中表示Scheme的数字塔时...但我更感兴趣的是表示“Type1可以是任何Type2加x,y ...”的更一般问题。
基于答案波纹管他们的意见:它看起来像,出口最上面的类型与一些辅助功能,以从下类型创建该类型是要对这个的最佳方式。 –
尽管看起来您需要为您的输入类型设置类型类(所以如果是SubA Int,SubB Float和SuperB String;那么您将需要一个用于Int和Float的SubInput类实例和一个SuperInput类实例对于Int,Float和String)。至少,这些类可以是空的。但是,你可以有mkSub :: SubInput a => a - >超级 –
那么,你的问题是什么? :) –