キムの答えを少し拡張し、関数値の限定された比較可能性を実現する方法の例を示したいと思います。
関数のある種の記述的な定義がある場合、この記述が等しいかどうかをチェックすることができます。たとえば、次の方法で単純な算術関数のクラス(ooクラスではない)を定義できます。
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}
この設定では、anArthFun
がそのクラスとメンバーによってArthFun
定義されているため、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)