假设我有一个复杂的 GADT,其中有许多隐藏的类型参数作为构造函数:
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
我想让这个数据类型可以显示,而不必手动编写实例。问题是,由于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
对隐藏数据类型的约束,尽管我不确定。
我该怎么办?