【发布时间】:2018-07-25 15:20:20
【问题描述】:
如果我有这样的事情:
def fn1(a:Integer)="1"
def fn2(a:Integer)="2"
val f=fn2 _
if( f== fn1 _) "1" else if(f==fn2 _) "2" else "other"
总是返回“其他”。如何在代码中知道哪个函数分配给了 f?
【问题讨论】:
-
在这种特殊情况下,
f(0)唯一地确定它是fn1还是fn2。否则,我不明白你在问什么。函数的外延相等(通常)是不可判定的。 -
我想知道哪个函数被分配给了 f。真实情况并非如此简单,因此无法解决评估函数
-
正如我上面提到的,图灵完备语言中通用函数的外延相等性是不确定的。在定义
f时,您通过对方法fn2进行eta 扩展来构造一个新函数。没有其他对象会与此函数相等,只有f == f会返回true,所有其他比较总是会产生false。 -
@AndreyTyukin 我想他问的是比较函数引用,而不是函数本身。
-
@Tim 正如您在我的回答中看到的,这是我能想到的唯一普遍适用的解决方案。但这有点无聊,而且几乎毫无意义,因为很明显,您总是可以比较引用,这与函数无关。
val a = new AnyRef; val b = new AnyRef也会给你a == a(true) 和a == b(false)...