Рассмотрим,
scala> object O {
| def f(g: Int => Int) = g(1)
| def f(g: PartialFunction[Int, Int]) = g(2).toString
| }
defined module O
scala> O f { _ * 1 }
res3: Int = 1
Итак, как вы теперь объединяете частичные функции?Или, другими словами, если описанная вами перегрузка была в библиотеке, и я написал следующее:
type PF = PartialFunction[Any, Int]
val pf1: PF = { case n: Int => n }
val pf2: PF = pf1 orElse { case x: String => x.length }
val pf3: PF = pf2 orElse { case d: Double => d.toInt }
Я получил бы сообщение об ошибке на pf2
из-за неоднозначности типа.Если вместо этого я пишу:
val pf2 = pf1 orElse ((_: Any) match { case x: String => x.length })
val pf3 = pf2 orElse ((_: Any) match { case d: Double => d.toInt })
, тогда я получаю сообщение об ошибке pf3
, потому что pf2
будет Function1
.