假設我有一個這樣的數據類型:有條件獲得顯示存在類型參數的類型構造
{-# LANGUAGE RankNTypes #-}
data X a = forall b. Show b => X (a b)
我想獲得Show (X a)
,但當然我只能這樣做,如果有一個實例Show (a b)
。我很想寫
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Show (a b) => Show (X a)
,但因爲它是由FORALL不幸的約束變量類型b
是不是在實例上下文中可用。
我的下一個嘗試是把Show (a b)
背景下移動到FORALL中的數據類型定義,就像這樣:
data X a = forall b. Show (a b) => X (a b)
deriving instance Show (X a)
這將編譯,但不幸的是,現在我已經失去了構建有一個X
的能力unshowable (a b)
。
是否有任何方法允許X
與任何(a b)
構建,然後有條件地推導Show (X a)
只有當(a b)
顯示?
太糟糕了。 GHC手冊中關於OverlappingInstances的所有內容都很可怕。 – Will
是的,這不是很好的建議。 Show1也可以很容易地打開其他實例。 –