13

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

如果我尝试将函数与==or进行比较eq,我将false在这两种情况下得到:

scala> f1 == f2
res0: Boolean = false

scala> f1 eq f2
res1: Boolean = false
4

2 回答 2

16

简短的回答:这是不可能的。

更长的答案:您可以拥有某种函数工厂,以确保“相同”的函数实际上是同一个对象。根据您的应用程序的体系结构,这可能不可行。

于 2012-10-04T10:30:45.390 回答
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}

使用此设置,其中 anArthFun由其类和成员定义,您可以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)
于 2012-10-04T11:18:29.033 回答