什么是关系参数?

Cla*_*diu 7 programming-languages

一个复杂的声音,没有一个简单的谷歌搜索的良好解释......是否有更多的学术导向的人可以解释这一个?

小智 7

两个答案都是正确的.我会说参数化是多态的一种可能属性.如果多态项在所有实例化下表现相同,则多态性是参数化的."行为相同"是一个模糊,直观的术语.John Reynolds引入了关系参数,作为对此的数学形式化.它声明多态术语保留所有关系,直观地迫使它表现相同:

考虑f:列表 - >列表.如果我们有关系a~1,b~2,c~3,...,那么我们可以将它提升到列表中,例如[a,d,b,c]〜[1,4,2,3]

现在,如果f([a,d,b,c])= [c,b,d,a]和f保持关系,那么f([1,4,2,3])= [3,2,4] ,1].换句话说,如果f反转字符串列表,它也会反转数字列表.

因此,关系参数化多态函数不能"检查类型参数",因为它们不能根据类型改变它们的行为.


Cla*_*diu 2

关系参数性似乎是对类型进行抽象的函数(如 Java 中的泛型)可以具有的属性。如果它具有此属性,则意味着它从不检查其类型参数或解构它/以某种特殊方式使用它。例如,这里的函数“id or inc”不是关系参数的:

public class Hey<T>
{
    public T idOrInc(T var)
    {
        if (var instanceof Integer)
            return (T)(new Integer(((Integer)var).intValue()+1));
        return var;
    }
    public static void main(String[] args) {
        Hey<Integer> h = new Hey<Integer>();
        System.out.println(h.idOrInc(new Integer(10)));
        Hey<Double> h2 = new Hey<Double>();
        System.out.println(h2.idOrInc(new Double(10)));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

$ java Hey
11
10.0
Run Code Online (Sandbox Code Playgroud)