当前位置: 首页 > 知识库问答 >
问题:

什么是类型量词?

金慈
2023-03-14
T Foo<T>(T x){ return x; }
int y = Foo<int>(3);

这些类型有时也是这样写的:

Foo :: forall T. T -> T

我曾听人说过“Forall就像Lambda--类型级别的抽象”。因此Foo是一个接受类型(例如int)并生成值的函数(例如int->int类型的函数)。许多语言都推断类型参数,这样您就可以编写foo(3)而不是foo (3)

假设我们有一个对象f,类型为forall t->T。对于这个对象,我们可以做的是首先通过编写f来传递一个类型q。然后返回一个类型为q->q的值。但是,某些f无效。例如,此f:

f<int> = (x => x+1)
f<T> = (x => x)
forall n in Integers: P(n)
forall n in Integers: P(n) == forall(Integers,P)
forall :: Set<T> -> (T -> bool) -> bool

Exists具有相同的类型。Forall就像一个无限连词,其中S[n]是集合S的第n个:

forall(S,P) = P(S[0]) ∧ P(S[1]) ∧ P(S[2]) ...

Exists就像一个无限的分离:

exists(S,P) = P(S[0]) ∨ P(S[1]) ∨ P(S[2]) ...

如果我们用类型做类比,我们可以说,∑的类型类比是计算交型Ⅶ,Ⅸ的类型类比是计算并型Ⅶ.然后我们可以在类型上定义forall和exists,如下所示:

forall(S,P) = P(S[0]) ∩ P(S[1]) ∩ P(S[2]) ...
exists(S,P) = P(S[0]) ∪ P(S[1]) ∪ P(S[2]) ...
forall, exists :: Set<T> -> (T -> Type) -> Type
forall(Types, t => (t -> t))
id :: forall T:Type. T -> T
id = (x => x)

id2 = id :: int -> int

一个有类型理论知识的人能解释什么是真正存在的吗?而“Forall在类型级别上是lambda”在多大程度上是真的呢?

共有1个答案

邵捷
2023-03-14

让我分别回答你们的问题。

>

  • 将forall称为“类型级别的lambda”是不准确的,原因有两个。首先,它是lambda的类型,而不是lambda本身。第二,lambda存在于术语级别,即使它对类型进行抽象(类型级别的lambda也存在,它们提供通常称为泛型类型的东西)。

    通用量化并不一定意味着所有实例都有“相同的行为”。这是一种称为“参数性”的特殊属性,它可能存在,也可能不存在。简单的多态lambda演算是参数的,因为您无法表达任何非参数行为。但是如果您添加了像typecase(也称为内涵类型分析)这样的构造,或者作为其较弱形式的checked强制转换,那么您就会放松参数性。参数性意味着良好的属性,例如,它允许在没有任何类型的运行时表示的情况下实现语言。它归纳了非常强的推理原则,参见Wadler的论文“定理免费!”。但这是一个权衡,有时你想要分派类型。

    pack(Int,(x.x,x.x)):T(Int T)×(T Int)

    这是一个简单的ADT,它的表示形式是Int,它只提供了两个操作(作为一个嵌套的元组),用于在抽象类型T中转换Int和从抽象类型T中转换Int。例如,这是模块类型理论的基础。

    总而言之,通用量化提供了客户端数据抽象,而存在类型则双重提供了实现方数据抽象。

  •  类似资料:
    • 本文向大家介绍C ++中的变量和变量类型是什么?,包括了C ++中的变量和变量类型是什么?的使用技巧和注意事项,需要的朋友参考一下 变量为我们提供了程序可以操纵的命名存储。C ++中的每个变量都有一个特定的类型,该类型确定变量的内存大小和布局。可以存储在该内存中的值的范围;以及可以应用于该变量的一组操作。一个非常简单的变量示例是- 在这里,我们有一个变量my_val,类型为int(integer)

    • 问题内容: 什么是 称为(反对) 您知道将尖括号放在哪里吗?我经常使用它,但不知道名字-烦我。搜索非常困难-Google会忽略字符。 (注意:这是Java) 问题答案: 泛型!:)

    • 问题内容: 我在Swift范例中看到值,例如带下划线的数字。这些值默认具有什么类型? 它是否取决于我为其分配的变量的类型?它们对我来说看起来很有趣而且很新,所以我想知道,如果不按类型定义就抛出它们,该如何处理? 问题答案: 从文档(《 Swift编程语言》->《语言指南》->《基础知识》->《数字文字》): 数字文字可以包含额外的格式,以使其更易于阅读。整数和浮点数都可以用额外的零填充,并且可以包

    • 问题内容: 什么是原始类型? 问题答案: Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承static的原始类型的非成员类型。RR 这是一个例子说明: 这是参数化类型(JLS 4.5)。通常,通俗地简称MyType为这种类型是很常见的

    • 。 > 有人能简单定义一下是什么吗? 是 泛型是禁止对象上非< code>K的额外键,还是允许它们,只是指示它们的属性不被转换为< code>T? 对于给定的示例: 它和这个完全一样吗

    • 问题内容: 我已经用Google搜索过两次,但仍然不了解超类型方法。谁能解释一下这是什么吗? 问题答案: OOPS中有超类型和子类型的概念,在Java中,这种关系是通过继承实现的,即使用关键字: 在超类中声明的任何成员(字段,方法)都称为超类型。 因此在上面的上下文中,如果类具有类似 Set是class的超类型方法。 但是,请注意,如果还有另一个类,请说: 然后,方法 不是类的 超类型 ,因为类与