我理解为什么新role system and annotations要求类型(和数据)系列参数位于角色nominal
。
所以当我宣布
时我就预料到了data family CoordinateRepresentation ty a :: *
ty
和a
将获得nominal
个角色。 (我的实际例子是一个相关的数据系列,但由于我认为它没有改变任何东西,我忽略了随之而来的额外噪音。)
我没想到的是当我把它改成
时data family CoordinateRepresentation ty :: * -> *
是未命名的第二种类型参数仍然具有nominal
角色。
这是为什么?无法安全地获得representational
角色,因为任何data instance CoordinateRepresentation ... = ...
都不必创建新的构造函数吗?该构造函数如何能够以编译器无法看到的方式在nominal
角色中使用其参数?即使它是一个开放的系统,并且有单独的编译,我仍然没有得到它。
答案 0 :(得分:6)
作为第一个小问题:数据系列是使用类型变量声明还是使用类型签名声明目前完全无关紧要,它们只是同一事物的不同语法。来自the GHC User's Guide的数据系列声明:
与GADT declarations一样,命名参数完全是可选的,[...]
重点仍然存在,并在this GHC trac thread中进行了讨论。简短摘要:可以通过为数据/类型系列添加角色推断和/或角色注释来实现,但尚未实现。