【发布时间】:2015-12-24 08:53:49
【问题描述】:
我在 Scala 中定义了两个版本的PartialFunction。
val doubleEvens1: PartialFunction[Int, Int] = {
case x if x % 2 == 0 => x * 2
}
val doubleEvens2 = new PartialFunction[Int, Int] {
override def isDefinedAt(x: Int): Boolean = x % 2 == 0
override def apply(v1: Int): Int = v1 * 2
}
还有一个清单:
val list = List(1, 2, 3, 4, 5)
但是,对于未定义的值,它们的行为会有所不同:
// doubleEvens1
println(doubleEvens1.isDefinedAt(3)) // false
println(list.collect(doubleEvens1)) // List(4, 8)
println(doubleEvens1(3)) // scala.MatchError
println(list.map(doubleEvens1)) // scala.MatchError
// doubleEvens2
println(doubleEvens2.isDefinedAt(3)) // false
println(list.collect(doubleEvens2)) // List(4, 8)
println(doubleEvens2(3)) // 6
println(list.map(doubleEvens2)) // List(2, 4, 6, 8, 10)
我猜doubleEvens1应该是合理的,因为它符合数学定义。但是doubleEvens2 的行为是故意设计的吗?还是我在代码 sn-p 中遗漏了什么?
【问题讨论】:
标签: scala functional-programming