如何比较两个Scala函数值的相等性.用例是我有一个函数列表,其中列表可以包含重复项,我只想执行一次每个函数.
如果我有:
scala> object A {
| def a {}
| }
defined module A
scala> val f1 = A.a _
f1: () => Unit = <function0>
scala> val f2 = A.a _
f2: () => Unit = <function0>
Run Code Online (Sandbox Code Playgroud)
如果我尝试的功能与任一比较==还是eq,我会false在两种情况下:
scala> f1 == f2
res0: Boolean = false
scala> f1 eq f2
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)
我想对Kim的答案进行一些解释,并举例说明如何实现函数值的有限可比性.
如果您对函数有某种描述性定义,则可以检查此描述的相等性.例如,您可以通过以下方式定义简单算术函数的类(而不是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}
Run Code Online (Sandbox Code Playgroud)
使用此设置,其中a ArthFun由其类和成员定义,您可以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)
Run Code Online (Sandbox Code Playgroud)