Gleichheitsbeziehungen in Scala

8

Ich bin gerade auf einen von Tony Morris ' Blog-Posts über Java gestoßen

Das klassische Problem manifestiert sich, wenn man etwa an einen Handel denkt. Nehmen wir an, ich mache zwei Trades von +100 Vodafone Shares @ 150p. Die beiden Berufe sind gleich, ja? Außer sie sind nicht der gleiche Handel . Im Falle eines normalen realen Systems, mit Persistenz oder Serialisierung, kann ich mich nicht auf Identität verlassen, um mir zu sagen, ob zwei Referenzen auf dasselbe Geschäft sind!

Ich möchte also eine Sammlung erstellen, zu der ich eine Gleichheitsbeziehung führen kann:

%Vor%

Wie würde ich meinen Satz auf effiziente Weise implementieren (außer der EqualityRelation definiert auch einen hash -Mechanismus)?

%Vor%

Also sind die Fragen:

  • Gibt es eine Bibliothek, die diese Fähigkeit bietet?
  • Gibt es eine Möglichkeit, das in Scala sauber zu machen?

Es scheint, dass es mit implicits ziemlich einfach ist, dem existierenden scala Set -Typ hinzuzufügen.

    
oxbow_lakes 26.02.2010, 12:55
quelle

3 Antworten

6

Dies kann bereits mit Java TreeSet und einer Comparator-Implementierung erreicht werden:

%Vor%

Ausgabe:

%Vor%

Dies hat die Nachteile, dass der zu implementierende Komparator leistungsfähiger ist als benötigt und dass Sie auf Sammlungen beschränkt sind, die Komparatoren unterstützen. Wie von oxbow_lakes gezeigt, bricht die Comparator-Implementierung den Set-Vertrag (für !a.equals(b) könnte es das sein new Set(); set.add(a) == true && set.add(b) == false ).

Scala unterstützt dies mit einer Ansichtstransformation von A = & gt; Bestellte [A].

%Vor%     
Thomas Jung 26.02.2010, 13:35
quelle
2

Sie beschreiben das Konzept einer Hashing-Strategie. Die Fundbibliothek enthält Sets und Maps, die mit Hash-Strategien erstellt werden können.

    
Craig P. Motlin 26.02.2010 13:40
quelle
2

Ich weiß, dass Sie nach Scala fragen, aber es lohnt sich, mit den Angeboten von .Net zu vergleichen. Insbesondere können alle Hash-basierten Sammlungen (zB Dictionary<TKey, TValue> und HashSet<T> ) eine Instanz von IEqualityComparer<T> . Dies ist vergleichbar mit Scalas Equiv[T] , liefert aber auch einen benutzerdefinierten Hash-Code . Sie könnten ein ähnliches Merkmal erstellen, indem Sie Equiv :

erstellen %Vor%

Um vollständig unterstützt zu werden, müssten Hash-basierte Sammlungen HashEquiv implizite Parameter zu ihrer Konstruktion hinzufügen und die implizit importierten equiv und hashOf Methoden anstelle der Object Instanzmethoden verwenden (wie TreeSet , usw. mit dem Merkmal Ordered , aber umgekehrt. Es müsste auch eine implizite Konvertierung von Any nach HashEquiv erfolgen, die die intrinsische Implementierung equals und hashCode verwendet.

    
Ben Lings 26.02.2010 22:06
quelle