为什么PartialFunction上没有orElse方法接受一个总函数?

时间:2011-10-11 11:37:58

标签: scala functional-programming

为什么在课程PartialFunction[A, B]上没有跟随签名的方法?

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

缺少这种方法背后是否存在一些逻辑上的原因,还是仅仅是疏忽?

3 个答案:

答案 0 :(得分:10)

  1. 因为通过提升部分功能来实现同样的目标是微不足道的

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

  2. 因为Scala通常会试图避免超载

  3. 因为没有人想添加它,到目前为止可能不需要它

  4. 因为添加到标准库的每个方法在下游维护方面都会产生不断增长的成本

答案 1 :(得分:1)

考虑,

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

答案 2 :(得分:0)

似乎没有任何充分理由在标准库中缺少这些功能,除了监督或者没有人需要这些功能,因为它们经常在标准库中使用。

我已定义了从A => BPartialFunction[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]