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

rig*_*old 8 syntax haskell gadt

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

data A a b where
    ...

data A :: * -> * -> * where
    ...
Run Code Online (Sandbox Code Playgroud)

dup*_*ode 8

没有区别.有人可能会认为在构造函数签名中不需要在头文件中使用类型变量就需要使用不同的名称,如:

data A :: * -> * -> * where
    AN :: Num x => x -> b -> A x b
    AS :: IsString s => s -> b -> A s b
Run Code Online (Sandbox Code Playgroud)

但是,正如GHC用户指南所说......

与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
Run Code Online (Sandbox Code Playgroud)

  • 事实上,我最喜欢第一个,但总是写第二个,因为它更短,我很懒.我_guess_文件给它们提供令人回味的名字可能是有用的. (2认同)