[英]Types constructors and existential types
仅多态函数可以应用于存在类型的值。 这些属性可以通过用于表达式的相应量词来表示,并可以通过自然变换来表征。
同样,当我们定义类型构造函数时
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
。
这就是总数 。 List :: * -> *
产生一种有效的类型*
给出任何说法a
样的*
。 Haskell 98数据类型始终是总计的,但是,正如您所指出的那样,在现代的Haskell中,您可以编写无法涵盖所有可能情况的类型族。 TRes Int
不是“真实”类型,从某种意义上说,它不包含任何值,它不会TRes Int
为任何其他类型,并且不等于TRes Int
以外的任何其他类型。
Haskell在值级别或类型级别(除了关于不确定实例的规则,这是一种钝器)之外,没有总计检查器,因此,就像没有办法排除undefined
值一样,也没有办法排除像TRes Int
这样的“卡住”类型的家庭。 (有关“卡死”类型系列的更多信息,请参阅TypeInType
的设计师Richard Eisenberg的博客文章 。)
自然是完全不同的想法。 在值级Haskell中, f
和g
之间的自然转换是将fx
类型的值映射到gx
类型的值的多态函数,而无需了解x
。
type f ~> g = forall x. f x -> g x
使用GHC 8和TypeInType
我们可以使用与谈论类型相同的语言来谈论类型,因为种类是类型。 全部forall x. fx -> gx
的类型表达式forall x. fx -> gx
forall x. fx -> gx
具有种类*
( (~>) :: forall k. (k -> *) -> (k -> *) -> *
),因此它也是类型的完美有效分类器。 具有这种类型的类型是将类型fx
的类型映射为类型gx
的多态类型函数。
在现实世界中,您将使用类型级别的自然转换做什么? 我不知道。 您可能不会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.