我试图了解是什么决定了类型参数是否必须是名义上的.
虽然GADT和类型族在某种意义上看起来不同,但它们不是"简单容器",因为它们的实例定义可以"查看"它们的参数,简单类型是否明显需要名义参数,比如Set?
Ice*_*ack 16
你应该能够强迫吗?
coerce :: Coercible a b => F a -> F b
Run Code Online (Sandbox Code Playgroud)
如果没有,那么论证F
应该是名义上的.
在Set
其第一个角色是名义上的情况下
type role Set nominal
Run Code Online (Sandbox Code Playgroud)
因为我们不想要
coerce :: Set Int -> Set ReversedInt
Run Code Online (Sandbox Code Playgroud)
因为newtype ReversedInt = RevInt Int
可以具有一个完全不同的Ord
比Int
和内部结构Set
取决于其元素的顺序.同样的Map
type role Map nominal representational
Run Code Online (Sandbox Code Playgroud)
对于像GADT一样
data F :: Type -> Type where
FInt :: F Int
Run Code Online (Sandbox Code Playgroud)
我们有一个居民,所以我们不想允许
coerce :: F Int -> F ReversedInt
Run Code Online (Sandbox Code Playgroud)
所以,GHC推断type role F nominal
.