Haskell 类型构造函数和存在类型

Haskell 类型构造函数和存在类型,haskell,existential-type,Haskell,Existential Type,只有多态函数才能应用于存在类型的值。 这些属性可以由表达式的相应量词表示,并以自然变换为特征 类似地,当我们定义类型构造函数时 data List a = Nil | Cons a (List a) 此类型构造函数适用于所有a,而类型族允许使用非统一类型构造函数 type family TRes i o type instance TRes Bool = String type instance TRes String = Bool 什么样的自然转换准确地描述了这种类型层次上的“一致性”理

只有多态函数才能应用于存在类型的值。 这些属性可以由表达式的相应量词表示,并以自然变换为特征

类似地,当我们定义类型构造函数时

data List a = Nil | Cons a (List a)
此类型构造函数适用于所有
a
,而类型族允许使用非统一类型构造函数

type family TRes i o
type instance TRes Bool = String
type instance TRes String  = Bool
什么样的自然转换准确地描述了这种类型层次上的“一致性”理念

是否有一种等同于强制自然性的方法,就像我们在价值层次上对排名n的类型所做的那样

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

我想你在这里混淆了几个不同的想法

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

这就是总体<代码>列表::*->*在给定
*
类型的任何参数
a
的情况下,生成有效类型的
*
。Haskell 98数据类型总是合计的,但是,正如您所指出的,在现代Haskell中,您可以编写不包括所有可能情况的类型族
TRes Int
不是一个“真实”类型,因为它不包含任何值,它不会减少到任何其他类型,也不等于除
TRes Int
之外的任何类型

Haskell在值级别或类型级别没有全集检查器(除了关于不可判定实例的规则,这是一个钝工具),因此,正如没有办法排除
未定义的
值一样,也没有办法排除像
TRes Int
这样的“卡住”类型族。(有关“卡住”类型系列的更多信息,请参见
TypeInType
的设计师理查德·艾森伯格)

自然性是一个完全不同的概念。在值级别Haskell中,
f
g
之间的自然转换是一个多态函数,它将
fx
类型的值映射到
gx
类型的值,而不知道
x

type f ~> g = forall x. f x -> g x
使用GHC 8和
TypeInType
我们可以使用与谈论类型相同的语言谈论类型,因为类型就是类型。所有x的类型表达式
。fx->gx
具有种类
*
(~>)::对于所有k.(k->*)->(k->*)->*
),因此它也是一个非常有效的类型分类器。具有该种类的类型是一个多态类型函数,它将种类
fx
的类型映射到种类
gx
的类型


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

我应该说清楚“为所有人统一工作”。我想知道的是这种自然主义的概念。显然,在价值和类型级别的不同类别中,加强自然性有助于确保树的进步。[11] Hasuo,I.,Jacobs,B.,Uustalu,T.:树上计算的分类视图。patrick bahr在值级别有一个很好的实现