Voglio dare un po 'di spazio alla risposta di Kim e dare un esempio di come ottenere una comparabilità limitata dei valori delle funzioni.
Se si dispone di una sorta di definizione descrittiva della propria funzione, è possibile verificare l'uguaglianza in questa descrizione. Ad esempio, è possibile definire una classe (non una classe oo) di funzioni aritmetiche semplici nel seguente modo:
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}
Con questa configurazione, in cui un ArthFun
è definita dalla sua classe e membri, è possibile verificare l'uguaglianza di valori del tipo ArthFun
semplicemente per l'uguaglianza dell'oggetto definita dalla classe case.
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)
È un problema indecidibile in generale. http://en.wikipedia.org/wiki/First-class_function#Equality_of_functions – missingfaktor