Почему в PartialFunction нет метода orElse, который принимает целую функцию? - PullRequest
10 голосов
/ 11 октября 2011

Почему в классе PartialFunction[A, B] нет метода со следующей сигнатурой?

def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1

Есть ли какая-то логическая причина отсутствия этого метода или это просто упущение?

Ответы [ 3 ]

10 голосов
/ 11 октября 2011
  1. Потому что тривиально достичь того же, подняв частичную функцию

    partialFunc.lift(arg) getOrElse (totalFunc(arg))

  2. Поскольку Scala, как правило, пытается избежатьперегрузка

  3. Поскольку никто не думал, что добавить его, и, вероятно, это пока не нужно

  4. Поскольку каждый метод добавлен в стандартную библиотекунесет постоянно растущие затраты с точки зрения обслуживания вниз по течению

1 голос
/ 13 октября 2011

Рассмотрим,

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.

0 голосов
/ 22 октября 2011

Похоже, что нет никаких веских причин для отсутствия этих функций в стандартной библиотеке, кроме как надзор или, может быть, никто не нуждается в них так часто, как в стандартных библиотеках.

Я определил неявное преобразование из 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...