GADT头中的类型变量是否有意义?

时间:2016-11-24 13:21:18

标签: haskell syntax gadt

这两个GADT声明之间有区别吗?

data A a b where
    ...

data A :: * -> * -> * where
    ...

1 个答案:

答案 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