为什么在PartialFunction[A, B]
上没有以下签名的方法?为什么PartialFunction中没有orElse方法接受全部函数?
def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1
这种方法的缺失是否存在逻辑上的原因,还是仅仅是疏忽?
为什么在PartialFunction[A, B]
上没有以下签名的方法?为什么PartialFunction中没有orElse方法接受全部函数?
def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1
这种方法的缺失是否存在逻辑上的原因,还是仅仅是疏忽?
因为它是琐碎来达到同样的抬起部分功能
partialFunc.lift(arg) getOrElse (totalFunc(arg))
因为Scala,一般会尽量避免超载
因为没有人想到再补充吧,到目前为止可能不需要
因为每个d每一个加入到标准库法招致下游maintainence
考虑的方面不断增长的成本,
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
。
我不明白这个问题。 :(你能否详细说明一下? – missingfaktor
我现在明白了你的观点,我不太在意这个名字,他们可以用其他的名字加上它 – missingfaktor
@missingfaktor啊,好的,我建议'否则'。:-) –
似乎在标准库中缺少这些函数没有什么好的理由,除了监督之外,或许没有人需要这些功能,因为他们经常在标准库中使用它们。
我已经定义了从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]
+1。感谢你的回答。回复你的子弹...... 1)这不是很有构图,让我提及并重复'arg'。此外,如果我们使用平凡的实现作为参数,那么Scala stdlib将不得不将其当前大小减半。 :-) 2)公平点。 3)我在过去三天需要它几次。 4)这是一个微不足道的方法来添加(如你所示)。我不认为它会增加任何明显的维护开销。 – missingfaktor
@missingfaktor难道你不能做'(pf.lift <*> f){_ getOrElse _} apply arg'或类似的东西吗? –
@oxbow_lakes:是的,我可以这样做,但对于我的口味来说,它仍然过于冗长(而且神秘)。 – missingfaktor