Я не уверен, что вы передаете в качестве частичной функции, но определенно вам следует определить ее с помощью конкретной c сигнатуры, например:
val positive: PartialFunction[Int, Option[Int]] = {
case x if x >= 0 => Some(x)
case _ => None
Функция positive
определена только для положительных чисел. В случае отрицательных чисел функция возвращает None, и вы не получите scala .MatchError во время выполнения.
Эта специфицированная c функция позволяет вам получить доступ к методу isDefinedAt
, который динамически тестируется, если значение находится в домене функции.
postive (5) .isDefinedAt // true
poistive.isInstanceOf [PartialFunction [Int, Option [Int]]] // true
Я продемонстрировал здесь, почему вы всегда получаете ложь, когда проверяете p.isInstanceOf
def doSomething[X,Y](opt:Option[X])(f:X=>Y)={
f match {
case p if p.isInstanceOf[PartialFunction[X,Y]] =>
println("I'm a pf")
println(s"Is it PartialFunction: ${p.isInstanceOf[PartialFunction[X,Y]]}")
opt.map(p)
case _ =>
println("I'm not a pf")
opt.map(f)
}
}
doSomething[Int, Option[Int]](Some(5))(positive) // partial function case
doSomething[Int, String](Some(5)) { // tricky case
case s => s.toString
}
Вы можете поиграть с ним здесь: