Chcę nieco rozszerzyć odpowiedź Kima i podać przykład, jak osiągnąć ograniczoną porównywalność wartości funkcji.
Jeśli masz jakąś opisową definicję swojej funkcji, na tym opisie możesz sprawdzić równość. Na przykład, można zdefiniować klasę (nie klasa oo) z prostych funkcji arytmetycznych w następujący sposób:
sealed trait ArthFun extends (Double => Double)
case class Mult(x: Double) extends ArthFun {def apply(y: Double) = x * y}
case class Add(x: Double) extends ArthFun {def apply(y: Double) = x + y}
Przy tej konfiguracji, gdzie ArthFun
jest zdefiniowany przez jego klasy i członków, można sprawdzić dla równości wartości typu ArthFun
po prostu przez równość obiektów zdefiniowaną przez klasę przypadków.
scala> trait ArthFun extends (Double => Double)
defined trait ArthFun
scala> case class Mult(y: Double) extends ArthFun { def apply(x: Double) = x * y; override def toString = "*" + y}
defined class Mult
scala> case class Add(y: Double) extends ArthFun { def apply(x: Double) = x + y; override def toString = "+" + y }
defined class Add
scala> Seq(Mult(5),Mult(4),Add(4),Add(3),Mult(5)).distinct
res4: Seq[Product with ArthFun with Serializable] = List(*5.0, *4.0, +4.0, +3.0)
Jest to ogólnie nie do rozwiązania problem. http://en.wikipedia.org/wiki/First-class_function#Equality_of_functions – missingfaktor