Acabo de tropezar con uno de Tony Morris 'blog-posts about Java y un problema fundamental con el lenguaje: el de definir una relación de igualdad a medida para una colección. Esto es algo que creo que es un gran problema y me preguntaba si había alguna solución scala.Relaciones de igualdad en Scala
El problema clásico se manifiesta al pensar, por ejemplo, en una operación. Digamos que hago dos intercambios de +100 participaciones de vodafone a 150p. Los dos intercambios son iguales, ¿sí? Excepto que no son la misma operación. En el caso de un sistema normal del mundo real, con persistencia o serialización, no puedo confiar en identidad para decirme si dos referencias son la misma operación!
Así que lo que quiero es ser capaz de crear una colección que me puede pasar una igualdad-relación con:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
¿Cómo puedo aplicar mi sistema de una manera eficiente (a menos que el EqualityRelation
define también una hash
mecanismo)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
Así que las preguntas son:
- ¿Hay una biblioteca que proporciona esta capacidad?
- ¿Hay alguna forma de hacerlo bien en Scala?
Parece que con implícitos, que sería una cosa bastante fácil de añadir a la Scala Set
tipo existente.
Equal in Scalaz: http://github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/ExampleEqual.scala. Pero no estoy lo suficientemente familiar como para decir qué se basa en eso. –
Creo que es solo un tipo seguro, por lo que '" Hola "=== 2' no compila –
scalaz.Equal no es solo tipo seguro, también es flexible. 'Equal [List [Foo]]]' es parametrizable por un 'Equal [Foo]'. Esto va a mitad de camino hacia tu objetivo. Martin Odersky declinó agregar 'Hash [T]' a la biblioteca estándar, diciendo que "queremos mantener el hashing universal, es demasiado parte de la cultura Java". http://www.scala-lang.org/node/4091#comment-16327 – retronym