2008-11-11 9 views

risposta

2

La parametrricità relazionale sembra essere la proprietà che può avere una funzione astratta rispetto ai tipi (come un generico in Java). Se ha questa proprietà, significa che non controlla mai il suo argomento di tipo o lo decostruisce/lo usa in un modo speciale. Ad esempio, la funzione "ID o inc" qui non è relazionale parametrico:

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

L'output è:

$ java Hey 
11 
10.0 
7

Entrambe le risposte sono per lo più a destra. Direi che la parametrricità è una possibile proprietà del polimorfismo. E il polimorfismo è parametrico se i termini polimorfici si comportano allo stesso modo in tutte le istanze. "Comportarsi allo stesso modo" è un termine vago e intuitivo. La parametricità relazionale è stata introdotta da John Reynolds come formalizzazione matematica di questo. Afferma che i termini polimorfici preservano tutte le relazioni, il che lo costringe intuitivamente a comportarsi allo stesso modo:

Si consideri f: una lista -> una lista. Se abbiamo la relazione a ~ 1, b ~ 2, c ~ 3, ..., possiamo sollevarla in elenchi e avere ad es. [a, d, b, c] ~ [1, 4, 2, 3]

Ora, se f ([a, d, b, c]) = [c, b, d, a] e f preserves relations, then f ([1, 4, 2, 3]) = [3, 2, 4, 1]. In altre parole, se f inverte l'elenco di stringhe, inverte anche gli elenchi di numeri.

Quindi le funzioni polimorfiche parametriche relazionate non possono "ispezionare l'argomento tipo", in quanto non possono alterare il loro comportamento in base al tipo.

Problemi correlati