2016-04-22 10 views
4

Ich verstehe, was ist partial order aus mathematischer Sicht, aber nicht sehen, wo und wie PartialOrdering Typ Klasse von Scala-Bibliothek verwendet werden kann. Ich habe die gesamte Standardbibliothek durchsucht und es gibt nur eine Verwendung: Sie wurde um die Bestellung erweitert. Die gleiche Geschichte für seine primäre Methode tryCompare, scheint es nirgends verwendet wird.Zweck der PartialOrdering in Scala-Bibliothek

Also, welche Vorteile ich haben kann, wenn statt

case class Foo(x: Int, y: String) 

val order = Ordering.by { foo => (foo.x, foo.y) } 

ich eine domänen richtige Instanz implementieren:

object PartialFoo extends PartialOrdering[Foo] { 
    def tryCompare(a: Foo, b: Foo): Option[Foo] = { 
    if (a.x != b.x) None // Doesn't make sense to compare foos with different xs 
    else ??? 
    } 
} 

UPD: Es scheint auch, wie Merkmal Bestell defined mit Rück Geben Sie Some[Int] (nicht Option[Int]) und ich kann nicht sogar Override verwenden. Ist es beabsichtigt?

+3

Die Standardbibliothek ist voller Geheimnisse wie dieses, und ich bin Ich bin mir nicht sicher, ob es eine bessere Antwort gibt als "jemand, der erfolgreich darum gebeten hat, dies irgendwann zu tun". –

+0

Auch der einzige Ort, an den ich mich erinnern kann, dass er jemals in einer Scala-Codebasis verwendet wurde, ist Algebird. –

Antwort

1

Dies scheint eine Vorlage für Typklassen zu sein, die natürliche partielle Ordnungen für einen Typ darstellen würde. Der Punkt dieser Klassen soll nicht explizit verwendet werden, sondern implizit in Bibliotheken, die einem Benutzer den Zugriff auf Methoden ermöglichen, die nur auf Typen mit einer solchen natürlichen Typklasse angewendet werden können.

Als Beispiel der Numeric Typ-Klasse, die zum Beispiel eines impliziter Parameter der sum Methode der Sammlungen ist, ist vorgesehen, eigentlich nie explizit, wenn so etwas wie val x = List(1, 2, 3).sum tun. Stattdessen importiert Scala standardmäßig ein -Objekt in den Gültigkeitsbereich, wodurch der Compiler "weiß", wie die Summe zu summieren ist.

Und wenn man ein Verfahren entwickeln, das würde nur „Arbeit“ für Elemente mit einer natürlichen partiellen Ordnung, es zwei Möglichkeiten wäre:

  1. erstellen ein Merkmal von Größen wie PartiallyOrdered und erfordern Argumente dieses Typs - das ist nicht sehr flexibel, vergleichen Sie einfach mit der Summenmethode, die bei jeder Sammlung aufgerufen werden kann

  2. einen impliziten Parameter vom Typ PartialOrdering[T] der Methode hinzufügen und Implementierungen für die gewünschten Typen erstellen.

Obwohl ich keine tatsächlichen Implementierungen von PartialOrdering nicht finden können, die auch nicht Reihenfolge implementieren, diese Klasse mit noch eine gute Sache ist, da es alle Benutzer bedeutet die PartialOrdering implementieren möchten, aber nicht Bestellung, ist auch in der Lage, Bestellungen an ihre Methode mit PartialOrdering's zu übergeben! z.B. Int, String usw.

Also sage ich eine Klasse A und eine partielle Ordnung

APartialOrdering extends PartialOrdering[A] erstellen.

Weil mein Typ A keine natürliche Reihenfolge zulässt, nur ein Teil.Schließlich schaffe ich eine Methode

def doSomethingForPartiallyOrdered[T](t: T)(implicit po: PartialOrdering[T]) = _

Nun, ich Objekte vom Typ passieren kann A, sondern auch Int des, Streicher usw.

+2

Ich gehe davon aus, dass das OP weiß, welche Art Klassen sind und wie sie in Scala codiert sind - das scheint nicht die Frage zu sein. Es ist auch nicht klar, was dein letzter Satz bedeutet - es ist sicherlich nicht möglich, ein 'PartialOrdering' zu liefern, bei dem eine' Sortierung' erwartet wird. –

+0

Nein, aber es ist möglich, eine Bestellung anstelle einer Teilbestellung anzugeben. Ich werde es klarer machen –