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在值级别有一个很好的实现