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"))