2

第二个实现有什么问题?

作品:

scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i }
res1: List[Int] = List(2)

不:

scala> val evens = PartialFunction[Any, Int]{
     | case i: Int if i % 2 == 0 => i
     | }
evens: PartialFunction[Any,Int] = <function1>

scala> List(1,2,3).collect{evens}
scala.MatchError: 1 (of class java.lang.Integer)
    at $anonfun$1.apply(<console>:7)
    at $anonfun$1.apply(<console>:7)
    at scala.PartialFunction$$anonfun$apply$1.applyOrElse(PartialFunction.scala:242)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
    at scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
    at scala.collection.immutable.List.foreach(List.scala:318)
    ...
4

2 回答 2

6

你应该evens PartialFunction这样创建:

val evens: PartialFunction[Any, Int] = {
  case i: Int if i % 2 == 0 => i
}

PartialFunction[Any, Int]{ ... }您一起调用applyobject 的方法PartialFunction。它是这样定义的:

def apply[A, B](f: (A) ⇒ B): PartialFunction[A, B]

So{ case i: Int if i % 2 == 0 => i }用作函数,而不是 aPartialFunction并且evens在任何参数中定义:

scala> val evens = PartialFunction[Any, Int]{
     |   case i: Int if i % 2 == 0 => i
     | }

scala> evens.isDefinedAt(1)
res1: Boolean = true

scala> val evens: PartialFunction[Any, Int] = {
     |   case i: Int if i % 2 == 0 => i
     | }

scala> evens.isDefinedAt(1)
res5: Boolean = false
于 2013-09-23T10:22:02.480 回答
1

您的代码实际上确实适用于 Scala 2.9.2(模不正确的部分函数声明)。但是,无论如何,原因可能是类型签名:

PartialFunction[Any, Int]

由于第一个类型参数是Any,集合元素被自动装箱到java.lang.Integer实例 - 它甚至在堆栈跟踪中这么说(必要时,因为Any对应于Object)。但是,您正在匹配 for Int,这会导致错误。

使用PartialFunction[Int, Int]应该可以解决问题,即:

val evens:PartialFunction[Int, Int] = {case i: Int if i % 2 == 0 => i}
于 2013-09-23T10:17:38.943 回答