如果我有这样的东西:
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?
答案 0 :(得分:1)
这也可行:
def fn1(a:Integer)="1"
def fn2(a:Integer)="2"
val f1=fn1 _
val f2=fn2 _
val f=f2
f match {
case `f1` => "1"
case `f2` => "2"
case _ => "other"
}
答案 1 :(得分:1)
由于函数的扩展等式(大致来说:f
被认为与g
相等,当且仅当f(x) == g(x)
对所有有效输入x
而言)不确定,基本上只有两个选择:
对于每个函数,请附加一些抽象描述,您可以在这些抽象描述上定义可确定的等价关系。例如,您可以构造这些函数的符号表示形式,从而可以定义内涵相等性或某种从下面近似近似扩展相等性的更强等价关系(可能难以实现,限制了它所起作用的功能集)
使用JVM引用相等性:
val fn1: (Int => String) = a => "1"
val fn2: (Int => String) = a => "2"
val f = fn2
println(if(f == fn1) "1" else if(f == fn2) "2" else "other")
这将输出"2"
。请注意,这种平等非常“脆弱”,例如
val fn3: (Int => String) = a => "2"
将不等于fn2
。