Scala:这两个部分函数等价吗?

Scala:这两个部分函数等价吗?,scala,Scala,这两个部分函数相等吗 val f0: PartialFunction[Int, String] = { case 10 => "ten" case n: Int => s"$n" } val f1 = new PartialFunction[Int, String] { override def isDefinedAt(x: Int): Boolean = true override def apply(v: Int): String = if (v == 10)

这两个部分函数相等吗

val f0: PartialFunction[Int, String] = {
  case 10 => "ten"
  case n: Int => s"$n"
}

val f1 = new PartialFunction[Int, String] {
  override def isDefinedAt(x: Int): Boolean = true
  override def apply(v: Int): String = if (v == 10) "ten" else s"$v"
}
UPD


现在它真的是PF吗?

我认为您需要两个部分(值)函数才能按设计方式使用
PartialFunction
:一个用于值10,另一个用于另一个
Int
s:

val f0:PartialFunction[Int, String] = { case 10 => "ten" }
val fDef:PartialFunction[Int, String] = { case n => s"$n" }
以及如何应用它们:

val t1 = (9 to 11) collect f0
t1 shouldBe(Array("ten"))
val t2 = (9 to 11) map (f0 orElse fDef)
t2 shouldBe(Array("9", "ten", "11"))

它们肯定总是有相同的行为,但根据所使用的scala编译器的版本,字节码中的表示可能不同。这就是你要问的吗?而且这些函数并不是严格意义上的分部函数,因为它们总是被定义的……我没有得到这个
,因为它们总是被定义的。你是什么意思?我需要添加
def-fun(n:Int)(pf:PartialFunction[Int,String]):String=pf。应用(n)
来生成
f0
f1
部分函数吗?拥有部分函数的想法是,它们可能没有为某些输入值定义。您的函数是为所有输入值定义的,因此您最好使用普通函数。这就是我所说的“它们总是被定义的”@Finkelson在编译器编译
f0
之后,它将生成类似
f1
的代码。是的,它们是等价的。它们不相等(
f0==f1
),因为scala没有为部分函数定义
=
。它们是局部的,但定义在整个范围内——这就是@jazmit的意思。如果删除第二行
case n:Int=…
并只保留第10行
case
,则只会在值
10
上定义函数,因此它将是真正的部分定义函数。在这种情况下,您的
被定义为
=(x==10)
,而
应用可以是
=“十”
val t1 = (9 to 11) collect f0
t1 shouldBe(Array("ten"))
val t2 = (9 to 11) map (f0 orElse fDef)
t2 shouldBe(Array("9", "ten", "11"))