したがって、次のようなことができれば便利です(必ずしもこの形式ではなく、一般的な考え方です)。
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
それはひどいことでも何でもありませんが、うまく拡張せず(SubZまでの場合はSubのようにこれはひどく不格好です)、Sub型を独自の型クラスに追加することはできません。この問題を回避するには、Subをラップします。
data Sub = SubA | SubB
data Super = SuperA Sub | SuperB
isSub :: Super -> Bool
isSub (SuperA _) = True
isSub _ = False
しかし今、あなたは彼らをスーパーとして使うためにあなたの潜水艦を包むことを確実にしなければなりません...再びひどいことではありません。私が望むセマンティクスを実際にはうまく表現していません(つまり、Superは任意のSubまたはSuperBにすることができます)。最初の(合法的な)例は「Supercan be SubA ...」であり、2番目の例は「Supercan be SuperA that take aSub...」です。
EDTI:音楽との混同を避けるためにいくつかの名前を変更します。
PS技術的には、これはHaskellでSchemeの数値タワーを表現する方法を考えていたときに始まりました...しかし、「Type1はType2に加えてx、y、... )。