如何知道分配了哪个功能?

时间:2018-07-25 15:20:21

标签: scala lambda equality

如果我有这样的东西:

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?

2 个答案:

答案 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而言)不确定,基本上只有两个选择:

  1. 对于每个函数,请附加一些抽象描述,您可以在这些抽象描述上定义可确定的等价关系。例如,您可以构造这些函数的符号表示形式,从而可以定义内涵相等性或某种从下面近似近似扩展相等性的更强等价关系(可能难以实现,限制了它所起作用的功能集)

  2. 使用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

相关问题