Почему нет метода со следующей сигнатурой в классе PartialFunction[A, B]
?
def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1
Есть ли какая-то логическая причина отсутствия этого метода, или это был простой надзор?
Почему нет метода со следующей сигнатурой в классе PartialFunction[A, B]
?
def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1
Есть ли какая-то логическая причина отсутствия этого метода, или это был простой надзор?
Поскольку тривиально добиться этого, подняв частичную функцию
partialFunc.lift(arg) getOrElse (totalFunc(arg))
Поскольку Scala, как правило, пытается избежать перегрузки
Потому что никто не думал добавить его, и он, вероятно, пока не понадобился
Поскольку каждый метод, добавленный в стандартную библиотеку, несет все возрастающую стоимость с точки зрения обслуживания ниже по течению
Рассмотрим,
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
.
Похоже, нет никакой веской причины для отсутствия этих функций в стандартной библиотеке, кроме надзора или, возможно, никто не нуждается в них так часто, как в стандартной библиотеке.
Я определил неявное преобразование от A => B
до PartialFunction[A, B]
, которое, похоже, позаботится об этом и других подобных случаях и не приводит к неблагоприятным последствиям.
scala> implicit def fToPf[A, B](f: A => B) = new PartialFunction[A, B] {
| def isDefinedAt(a: A) = true
| def apply(a: A) = f(a)
| }
fToPf: [A, B](f: A => B)java.lang.Object with PartialFunction[A,B]