我试图理解是什么决定了类型参数是否必须是名义上的。
虽然GADT和类型家族在某种意义上看起来不同,但它们不是“简单容器”,因为它们的实例定义可以“查看”它们的参数,简单类型是否明显需要名义参数,比如Set?
答案 0 :(得分:15)
你能够强迫吗?
coerce :: Coercible a b => F a -> F b
如果没有,那么F
的论点应该是名义上的。
在Set
的情况下,它的第一个角色是名义上的
type role Set nominal
因为我们不想要
coerce :: Set Int -> Set ReversedInt
因为newtype ReversedInt = RevInt Int
可能与Ord
完全不同Int
而Set
的内部结构取决于其元素的排序。 Map
type role Map nominal representational
对于GADT而言
data F :: Type -> Type where
FInt :: F Int
我们有一个居民,所以我们不想允许
coerce :: F Int -> F ReversedInt
因此,GHC推断type role F nominal
。