2008-11-11 7 views

Antwort

2

Relationale Parametrik scheint die Eigenschaft zu sein, die eine über Typen abstrahierte Funktion (wie eine generische in Java) haben kann. Wenn es diese Eigenschaft hat, bedeutet das, dass es sein Typargument nie inspiziert oder dekonstruiert/verwendet es auf eine spezielle Art und Weise. Zum Beispiel ist hier die Funktion „ID oder inc“ ist nicht relational parametrischer:

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))); 
    } 
} 

Die Ausgabe lautet:

$ java Hey 
11 
10.0 
7

Beide Antworten sind meist recht. Ich würde sagen, dass Parametrik eine mögliche Eigenschaft des Polymorphismus ist. Und Polymorphismus ist parametrisch, wenn sich polymorphe Terme unter allen Instanziierungen gleich verhalten. Sich "gleich verhalten" ist ein vager, intuitiver Begriff. Relationale Parametrik wurde von John Reynolds als mathematische Formalisierung eingeführt. Es besagt, dass polymorphe Terme alle Beziehungen beibehalten, was sie intuitiv dazu zwingt, sich gleich zu verhalten:

Betrachten wir f: eine Liste -> eine Liste. Wenn wir die Beziehung a ~ 1, b ~ 2, c ~ 3, ... haben, können wir sie auf Listen heben und haben z. [a, d, b, c] ~ [1, 4, 2, 3]

Nun, wenn f ([a, d, b, c]) = [c, b, d, a] und f erhält die Relationen dann f ([1, 4, 2, 3]) = [3, 2, 4, 1]. Mit anderen Worten, wenn f die Liste der Strings umkehrt, werden auch die Listen der Strings umgekehrt.

So können relational parametrische polymorphe Funktionen das "type argument" nicht untersuchen, da sie ihr Verhalten nicht basierend auf dem Typ ändern können.