如何比较两个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>
如果我尝试将该功能与==
或eq
进行比较,我会在两种情况下都获得false
:
scala> f1 == f2
res0: Boolean = false
scala> f1 eq f2
res1: Boolean = false
答案 0 :(得分:15)
简短回答:这是不可能的。
更长的答案:您可以拥有某种功能工厂,确保“相同”功能在实际上是同一个对象。根据应用程序的体系结构,这可能不太可行。
答案 1 :(得分:8)
我想对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}
使用此设置,ArthFun
由其类和成员定义,您可以通过案例类定义的对象相等性来检查ArthFun
类型的值的相等性。
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)