2008-11-11 5 views

Répondre

2

La paramétricité relationnelle semble être la propriété qu'une fonction peut avoir sur des types (comme un générique en Java). S'il a cette propriété, cela signifie qu'il n'inspecte jamais son argument type ou ne le déconstruit/ne l'utilise d'une manière particulière. Par exemple, la fonction "id ou inc" n'est pas ici paramétrique relationnellement:

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

La sortie est:

$ java Hey 
11 
10.0 
7

Les deux réponses sont la plupart du temps droit. Je dirais que la paramétricité est une propriété possible du polymorphisme. Et le polymorphisme est paramétrique si les termes polymorphes se comportent de la même manière dans toutes les instanciations. "Se comporter de la même manière" est un terme vague et intuitif. La paramétricité relationnelle a été introduite par John Reynolds comme une formalisation mathématique de ceci. Il indique que les termes polymorphes conservent toutes les relations, ce qui le force intuitivement à se comporter de la même manière:

Considérons f: une liste -> une liste. Si nous avons la relation a ~ 1, b ~ 2, c ~ 3, ..., alors nous pouvons le soulever à des listes et par exemple. [a, d, b, c] ~ [1, 4, 2, 3]

Maintenant, si f ([a, d, b, c]) = [c, b, d, a] et f préserve les relations, alors f ([1, 4, 2, 3]) = [3, 2, 4, 1]. En d'autres termes, si f renverse la liste des chaînes, il inverse également les listes de nombres. Donc, les fonctions polymorphes paramétriques relationnelles ne peuvent pas "inspecter l'argument de type", en ce sens qu'elles ne peuvent pas modifier leur comportement en fonction du type.

Questions connexes