标称类型角色和数据系列

时间:2014-08-28 02:33:45

标签: haskell ghc type-families

我理解为什么新role system and annotations要求类型(和数据)系列参数位于角色nominal

所以当我宣布

时我就预料到了
data family CoordinateRepresentation ty a :: *

tya将获得nominal个角色。 (我的实际例子是一个相关的数据系列,但由于我认为它没有改变任何东西,我忽略了随之而来的额外噪音。)

我没想到的是当我把它改成

data family CoordinateRepresentation ty :: * -> *

是未命名的第二种类型参数仍然具有nominal角色。

这是为什么?无法安全地获得representational角色,因为任何data instance CoordinateRepresentation ... = ...都不必创建新的构造函数吗?该构造函数如何能够以编译器无法看到的方式在nominal角色中使用其参数?即使它是一个开放的系统,并且有单独的编译,我仍然没有得到它。

1 个答案:

答案 0 :(得分:6)

作为第一个小问题:数据系列是使用类型变量声明还是使用类型签名声明目前完全无关紧要,它们只是同一事物的不同语法。来自the GHC User's Guide的数据系列声明:

  

GADT declarations一样,命名参数完全是可选的,[...]

重点仍然存在,并在this GHC trac thread中进行了讨论。简短摘要:可以通过为数据/类型系列添加角色推断和/或角色注释来实现,但尚未实现。