繁体   English   中英

类型构造函数和存在类型

[英]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中, fg之间的自然转换是将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM