Generics 是否有任何语言将整数数学合并到其类型系统中?

Generics 是否有任何语言将整数数学合并到其类型系统中?,generics,types,language-design,Generics,Types,Language Design,我一直在考虑一个假设的语言特性,我想知道是否有任何语言做过类似的事情,我可以从中学习,或者可以提供相关的搜索词 对于语言来说,允许使用约束类型参数(通常称为泛型)专门处理类型是非常常见的。例如,Foo作为类型 我很好奇是否有任何语言允许我们使用特定的整数值来参数化类型,比如Foo。用例的一个简单示例可能是可以由类型检查器静态检查的固定长度数组 我对可能允许在类型系统中进行基本数学运算的语言特别感兴趣。这种C#风格的伪代码将两个固定长度数组连接成具有已知长度的第三个固定长度数组,编译器将计算该数组

我一直在考虑一个假设的语言特性,我想知道是否有任何语言做过类似的事情,我可以从中学习,或者可以提供相关的搜索词

对于语言来说,允许使用约束类型参数(通常称为泛型)专门处理类型是非常常见的。例如,
Foo
作为类型

我很好奇是否有任何语言允许我们使用特定的整数值来参数化类型,比如
Foo
。用例的一个简单示例可能是可以由类型检查器静态检查的固定长度数组

我对可能允许在类型系统中进行基本数学运算的语言特别感兴趣。这种C#风格的伪代码将两个固定长度数组连接成具有已知长度的第三个固定长度数组,编译器将计算该数组并将其视为常量

FixedArray<Length1 + Length2> Concat<Length1, Length2>(FixedArray<Length1> a, FixedArray<Length2> b)
    where Length1: Integer, >= 0
    where Length2: Integer, >= 0
    {}
FixedArray Concat(FixedArray a,FixedArray b)
其中Length1:Integer,>=0
其中Length2:Integer,>=0
{}
我知道TypeScript,很接近。它允许常量作为类型,因此
Foo
是有效的。但是,我相信类型系统更像是把它们当作枚举或符号来对待,而不是把它们理解为数学值。有一些方法可以使用重载来假装这一点


研究关键字和讨论类似特性的文档——即使不是用语言实现的——也很有趣。虽然不喜欢对类型理论有很深的了解,但我还是要做任何事情。在C++中,

< P>可以用整数参数化模板。事实上,标准中有一个
模板结构数组
。您可以定义一个函数,将其与编译时类型检查连接起来,如下所示:

template<class T, size_t N1, size_t N2> array<T, N1+N2> concat(
    const array<T, N1> &a, const array<T, N2> &b)
{
    array<T, N1+N2> ret;
    /* copy data into ret */
    return ret;
}
模板数组concat(
常量数组(a、常量数组和b)
{
阵列ret;
/*将数据复制到ret*/
返回ret;
}
使用时,将在编译期间检查类型:

array<T, 10> a;
array<T, 5> b;
array<T, 14> ab1 = concat(a, b); // error
array<T, 15> ab2 = concat(a, b); // works
auto ab3 = concat(a, b); // type of ab3 is auto-deduced to array<T, 15>
数组a;
阵列b;
数组ab1=concat(a,b);//错误
数组ab2=concat(a,b);//作品
自动ab3=concat(a,b);//ab3的类型自动推断为阵列

这是一个。

我想你可能要找的术语是。这不是一个非常具体的术语,但它意味着类型可以依赖于值,值通常包括数字

下面是一个依赖类型编程语言的示例:

total
append : Vect n a -> Vect m a -> Vect (n + m) a
append Nil       ys = ys
append (x :: xs) ys = x :: append xs ys

n
m
Vect
的类型参数,表示向量的长度,因此将两个
Vect
s相加的结果的长度是
n+m

哦,天哪,我应该记得!自从我使用C++以来,已经有很长时间了。C++调用这些“非类型模板参数”,这对于查找其他类似的东西是没有帮助的。您不会碰巧知道这种编译类型数学表达式功能的另一个名称吧?我可能会接受这个答案,谢谢,还有!山姆:我不知道这个有什么特别的名字。对我来说,这只是编译时评估的另一种形式。