那麼,什麼將是很好的,如果你可以做類似下面的(不一定是這種格式,只是一般的想法):嵌套/分數據類型
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 - >超級 –
那麼,你的問題是什麼? :) –