Generics 泛型的参数化值是否与依赖类型相同?

Generics 泛型的参数化值是否与依赖类型相同?,generics,language-agnostic,dependent-type,Generics,Language Agnostic,Dependent Type,我一直在阅读关于依赖类型的文章,我有一个问题要确定我没有误解什么。第一步是: 在计算机科学和逻辑中,依赖类型是其定义取决于值的类型。“一对整数”是一种类型。“第二个大于第一个的整数对”是依赖类型,因为它依赖于值 假设我有一种语言,可以表示一个范围内的数字: struct Int<Min, Max> struct Int 例如,类型Int表示一个介于0和10之间的整数 作为奖励,假设我引入了一般方差: struct Int<in Min, out Max> stru

我一直在阅读关于依赖类型的文章,我有一个问题要确定我没有误解什么。第一步是:

在计算机科学和逻辑中,依赖类型是其定义取决于值的类型。“一对整数”是一种类型。“第二个大于第一个的整数对”是依赖类型,因为它依赖于值


假设我有一种语言,可以表示一个范围内的数字:

struct Int<Min, Max>
struct Int
例如,类型
Int
表示一个介于0和10之间的整数

作为奖励,假设我引入了一般方差:

struct Int<in Min, out Max>
struct Int
例如,可以将
Int
Int
等类型的实例分配给
Int
类型的变量

现在,此类型上的添加操作可以具有如下签名:

Int<Min1 + Min2, Max1 + Max2> operator+(Int<Min1, Max1> op1, Int<Min2, Max2> op2);
Int运算符+(Int op1,Int op2);
因此,添加
Int
Int
将生成类型为
Int
的结果

在这种类型系统中,我们还可以有有序对,例如:

struct OrderedPair<Min, Mid, Max>
{
    Int<Min, Mid> SmallerNumber;
    Int<Mid, Max> LargerNumber;
}
struct OrderedPair
{
Int SmallerNumber;
国际大数;
}
等等



这与依赖类型不同吗?如果是,如何进行?

这是一种有限形式的依赖类型,其中类型可以依赖于值,但这些值必须在编译时可用

在完全依赖类型的语言(如类型)中,类型也可以依赖于运行时值。为了构造这样的值,您需要一个值驻留在类型中的范围内。获得证明的一种方法是使用简单测试(伪代码):

m=用户输入();
n=用户输入();
//类型错误:n不保证在范围内。
x=Int(n);

如果(n>=0&&n=0和n)依赖类型允许您将谓词附加到类型,并检查它是否在所有操作中都有效。如果您可以将系统限制为几个谓词(如范围的最小/最大值),你可以在一定程度上把它转移到类型参数上;我听说Haskell允许这样做。也就是说,对于一个范围内的数字或不超过N个元素的列表的实际情况,你可能可以做到。在一般情况下,很可能不可以,否则人们为什么要发明依赖类型的语言?@9000是的,我基本上是在尝试确定某些类型(如此
Int
、可能的
列表以及其他一些类型),基本上可以用作构建块,以获得依赖类型的整个类型系统,或者依赖类型系统完全是另一回事。创建实例所需的证明部分对我来说很有意义。然而,在这段代码中,
m
是一个运行时值。这不仅仅是我们从
n
(大概是不受限制的
int
)对于
Int
,我理解这一部分。但是
Int
包含一个静态未知的值。那么封闭函数能否返回
x
?封闭函数的类型是否为
Int
?如果是这样,当我尝试将
Int
赋值给
Int
时,编译器如何知道我是否要返回more或不太具体的类型?if语句中的
x
类型是
Int
,但封闭函数的类型不能是该类型,因为不知道(无法证明)运行时值是否会通过此if检查。但是,如果您有一个else子句返回
0
(或
m
),然后您可以推导出整个事件的返回类型是
Int
@TheodorosChatzigiannakis:我认为您可以通过将其包装为存在形式来返回值,
∃m、 Int
,则调用者可以将其解包,以便在本地使用
m
的值。也就是说,函数说“对于某些m,我返回[0,m]范围内的值”。存在类型称为“依赖对”或“sigma类型”在这种情况下,因为它是一对值
m
和依赖于它的类型
Int
m = user_input();
n = user_input();

// Type error: n is not guaranteed to be in range.
x = Int<0, m>(n);

if (n >= 0 && n <= m) {
  // Accepted: proofs of n >= 0 and n <= m in scope.
  x = Int<0, m>(n);
}