类型构造函数和存在类型

Posted

技术标签:

【中文标题】类型构造函数和存在类型【英文标题】:Types constructors and existential types 【发布时间】:2017-04-20 11:21:38 【问题描述】:

只有多态函数可以应用于存在类型的值。 这些属性可以通过相应的表达式量词来表达,并通过自然变换来表征。

同样,当我们定义一个类型构造函数时

data List a = Nil | Cons a (List a)

此类型构造函数适用于所有a,而类型族允许具有非统一类型构造函数

type family TRes i o
type instance TRes Bool = String
type instance TRes String  = Bool

在类型级别上,这种“统一性”概念的确切特征是什么自然转换?

是否存在类似于我们在价值级别使用 rank-n 类型的强制自然性的等价物?

ApplyNat :: (forall a. a -> F a) -> b -> F b

【问题讨论】:

【参考方案1】:

我认为您在这里混淆了几个不同的想法。

此类型构造函数适用于所有a

这是整体。给定a 类型* 的任何参数,List :: * -> * 生成类型* 的有效类型。 Haskell 98 数据类型总是总数,但是,正如您所指出的,在现代 Haskell 中,您可以编写不涵盖所有可能情况的类型系列。 TRes Int 不是“真正的”类型,因为它不包含任何值,它不归约为任何其他类型,并且不等于 TRes Int 以外的任何类型。

Haskell 在值级别或类型级别没有整体检查器(除了关于不可判定实例的规则,这是一种钝器),因此,正如无法排除 undefined 值一样,有无法排除像TRes Int 这样的“卡住”类型的家庭。 (有关“卡住”类型家族的更多信息,请参阅TypeInType 的设计师 Richard Eisenberg 的this blog post。)

自然是一个完全不同的概念。在值级别的 Haskell 中,fg 之间的自然转换是一个多态函数,将 f x 类型的值映射到 g x 类型的值,而无需了解任何关于 x 的信息。

type f ~> g = forall x. f x -> g x

在 GHC 8 和 TypeInType 中,我们可以使用我们用来讨论类型的相同语言来讨论种类,因为种类类型。类型表达式forall x. f x -> g x 具有类型* ((~>) :: forall k. (k -> *) -> (k -> *) -> *),因此它也是一个完全有效的类型分类器。具有这种类型的类型是多态类型函数,将类型 f x 映射到类型 g x

在现实世界中,您会将类型级别的自然转换用于什么目的?我不知道。你可能不会。

【讨论】:

我应该明确“为所有人统一工作”。这是我想知道的自然概念。显然,在价值和类型级别上属于不同的类别。 强制自然对于确保树的进度很有用。 [11] Hasuo, I., Jacobs, B., Uustalu, T.:关于树计算的分类观点。 patrick bahr itu.dk/people/paba/pubs/files/bahr12mpc-paper.pdf在价值层面有一个很好的实现@

以上是关于类型构造函数和存在类型的主要内容,如果未能解决你的问题,请参考以下文章

具有约束的内联记录构造函数的存在类型

面向对象原型链小结

常见的构造函数类型

类--其他特性,作用域,构造函数,静态成员

构造函数

007.类构造函数