Po prostu natknąłem się na jeden z Tony'ego Morrisa: "blog-posts about Java" i podstawowy problem z językiem: definiowanie dostosowanej relacji z równością dla kolekcji. Jest to coś, co myślę, że jest to wielka sprawa i zastanawiałem się, czy było jakieś rozwiązanie scala.Relacje równości w Scali
Klasyczna kwestia przejawia się w myśleniu o, powiedzmy, handlu. Powiedzmy, że wykonuję dwie transakcje +100 udziałów vodafone @ 150p. Te dwie transakcje są równe, tak? Z tym wyjątkiem, że nie są to o tej samej nazwie handlowej. W przypadku normalnego, rzeczywistego systemu, z utrwalaniem się lub serializacją, nie mogę polegać na tożsamości, aby powiedzieć mi, czy dwa odnośniki są do tym samym handlem!
Więc czego chcę to, aby móc stworzyć kolekcję, które mogę przekazać równouprawnienia odniesieniu do:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
Jak wdrożyć mój zestaw w sposób efektywny (chyba że EqualityRelation
określa również hash
mechanizm)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
więc pytania są:
- Czy istnieje biblioteka, która oferuje tę możliwość?
- Czy jest jakiś sposób robienia tego zgrabnie w Scali?
Wygląda na to, że dodanie impulsu do istniejącego typu scala Set
wydaje się dość łatwe.
Jest równy w Scalaz: http://github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/ExampleEqual.scala. Ale nie jestem dość znany, aby powiedzieć, co na nim opiera. –
Myślę, że to po prostu "safe" jest równy, więc '' Hello "=== 2' nie kompiluje –
scalaz.Equal jest nie tylko bezpiecznym typem, ale także elastycznym. 'Equal [List [Foo]]]' można parametryzować za pomocą 'Equal [Foo]'. To idzie w połowie do celu. Martin Odersky odmówił dodania "Hash [T]" do standardowej biblioteki, mówiąc, że "chcemy utrzymać uniwersalne hashu, to zbyt duża część kultury Java". http://www.scala-lang.org/node/4091#comment-16327 – retronym