2011-06-09 4 views
2

Selon la documentation, PartiallyOrdered[A] est covariant dans A, tandis que Ordered[A] est invariant (mais utilisé pour être covariant) dans A.Variance de Ordered, PartiallyOrdered

Pourquoi Ordered[A] était-il toujours covariant dans A? N'est-ce pas une violation évidente du principe de substitution? Pourquoi Ordered[A] ne peut-il pas être contravariant dans A? Cela permettrait de saisir Ordered[Traversible[Char]] comme Ordered[StringBuilder], par exemple. Je ne vois pas comment cela pourrait être problématique. J'ai des difficultés à comprendre la signature de tryCompareTo en PartiallyOrdered. Il semble que l'argument peut être une instance de n'importe quel type de A. Ne pourriez-vous passer aucun objet en appelant le tryCompareTo[Any](anything)? Si oui, comment la signature de la méthode est-elle meilleure que tryCompareTo(that: Any)? Logiquement, les ensembles ordonnés sont une sous-classe d'ensembles partiellement ordonnés, mais les classes Scala ne semblent pas refléter cette relation. Est-ce parce que Ordered[A] ne peut pas être covariant dans A comme PartiallyOrdered[A] peut?

Répondre

2

En regardant le previous version (2.8.1), je n'ai pas trouvé quelque chose de pertinent au sujet de Ordered qui était covariant?

EDIT: plus loin et trouver Looked certains explanation dans la documentation Ordered de ne pas être covariants plus.

Pour le cas de tryCompare dans PartiallyOrdered, la signature ensemble plus de restriction sur le paramètre passé:

def tryCompareTo [B >: A] (that: B)(implicit arg0: (B) ⇒ PartiallyOrdered[B]): Option[Int] 

Ici, le arg0 implicite implique that être considérée comme une instance PartiallyOrdered[B] et donc qu'il a accès à toutes les méthodes défini dans ce trait.

+0

Merci pour la réponse. Je suppose que je comprends tryCompareTo, après avoir regardé la signature pendant un petit moment. Des indications sur la variance de Ordered [A], cependant? –

+0

Je ne vais pas encore éditer la réponse parce que je ne suis pas sûr de ce point mais je pense que c'est parce que vous ne pouvez pas être sûr que 'Ordered [A]' est égal à 'Ordered [B]' même si 'B <: A'. Plus de détails dans ce [extrait de Programming in Scala] (http://www.artima.com/pins1ed/object-equality.html) –

Questions connexes