自動獲得節目實例假設我有一個複雜GADT與許多隱藏類型參數的構造函數:爲GADTs
data T where
A :: Num n => n -> T
B :: (Num n, Integral m) => n -> m -> T
C :: Floating a => [a] -> T
-- and so on
Z :: Num n => n -> n -> T
我想使這個數據類型showable,而無需手動編寫的實例。問題是,由於Show
不再是Num
的超類,因此編譯器只需添加一個簡單的deriving instance Show T
即可推斷它必須將Show
約束添加到所有內部隱藏類型參數中。
對於每個隱藏類型參數時,它輸出像
Could not deduce (Show n) arising from a use of 'showsPrec'
from the context Num n
bound by a pattern with constructor
A :: forall n. Num n => n -> T
...
Possible fix:
add (Show n) to the context of the data constructor 'A'
添加Show
約束到數據類型是不是一種選擇,因爲相關它限制了T
可能居民。好像deriving instanec Show T
應該在隱藏的數據類型上引入約束Show
,雖然我不確定。
我該怎麼辦?
如果增加約束將限制居民,導出機制當然不會爲你做,也不希望它。 – Lazersmoke
@Lazersmoke我的意思是將約束添加到派生實例。這並不限制居民,它只是以一種連貫的方式構建「Show」實例。 – ThreeFx
沒有好的T的Show實例,不管你做什麼,除非你將所有Tyvars(包括存在)限制在Show中。 – Lazersmoke