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

时间:2018-03-10 13:48:05

标签: haskell

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

虽然GADT和类型家族在某种意义上看起来不同,但它们不是“简单容器”,因为它们的实例定义可以“查看”它们的参数,简单类型是否明显需要名义参数,比如Set?

1 个答案:

答案 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完全不同IntSet的内部结构取决于其元素的排序。 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