如何比较Scala函数值是否相等

时间:2012-10-04 10:27:21

标签: scala

如何比较两个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

2 个答案:

答案 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)