这两个GADT声明之间有区别吗?
data A a b where
...
data A :: * -> * -> * where
...
答案 0 :(得分:8)
没有区别。有人可能会认为在构造函数签名中不需要在头文件中提及类型变量就需要使用不同的名称,如:
data A :: * -> * -> * where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b
然而,正如the GHC Users Guide所说......
与Haskell-98样式的数据类型声明不同,
data Set a where
标头中的类型变量没有范围。
......所以这也有效:
data A a b where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b