最简单的例子证明了Haskell中名义类型角色的需要

sev*_*evo 12 haskell

我试图了解是什么决定了类型参数是否必须是名义上的.

虽然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可以具有一个完全不同的OrdInt和内部结构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.