我正在阅读“Scala编程”一书。在本书中,它说“函数文字被编译成一个在运行时实例化时是一个函数值的类”。并且它提到“函数值是对象,因此如果您愿意,可以将它们存储在变量中。”
所以我尝试检查函数之间的相等性。但我失败了。
如果函数是Scala中的对象,那么它应该像Scala中的其他对象一样运行。也许检查函数的等价是没有意义的,所以它被禁用了?
并且将函数编译成Scala中的对象吗?
答案 0 :(得分:10)
Lambda被编译为匿名类(根据我的记忆,不是案例类)。这意味着如果你这样做:
val f1: (String) => String = _ => "F1"
val f2: (String) => String = _ => "F2"
f1
和f2
都是Function1[String,String]
的子类型,但它们属于不同的匿名类,因此不能相等。
如果你把它写成:
case class F(res: String) extends ((String) => String) {
def apply(s: String) = res
}
然后:
val f1: (String) => String = F("A")
val f2: (String) => String = F("A")
f1 == f2 // true
答案 1 :(得分:5)
目前尚不清楚功能的“平等”意味着什么。通常,人们关心的是“这两个函数是否会计算相同的结果?”
然而,这是一个众所周知的不可判定的问题,功能问题。显然,实际证明更复杂,但一个简单的直觉是:如果你能判断两个函数是否相等,那么你可以通过询问“这个函数是否等于while (true) {}
来解决停机问题”。
因此,我们无法确定两个函数是否计算相同的结果。我们可能做的是,例如,检查它们是否包含完全相同的代码。但这很无聊。只是一些微小的编译器优化或重命名单个变量将使两个函数在直觉上应该相等而不相等。
因此,我们采取简单的方法:如果它们相同则两个函数相等,否则它们不相同。