2011-10-11 32 views

回答

10
  1. 因为它是琐碎来达到同样的抬起部分功能

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

  2. 因为Scala,一般会尽量避免超载

  3. 因为没有人想到再补充吧,到目前为止可能不需要

  4. 因为每个d每一个加入到标准库法招致下游maintainence

+2

+1。感谢你的回答。回复你的子弹...... 1)这不是很有构图,让我提及并重复'arg'。此外,如果我们使用平凡的实现作为参数,那么Scala stdlib将不得不将其当前大小减半。 :-) 2)公平点。 3)我在过去三天需要它几次。 4)这是一个微不足道的方法来添加(如你所示)。我不认为它会增加任何明显的维护开销。 – missingfaktor

+0

@missingfaktor难道你不能做'(pf.lift <*> f){_ getOrElse _} apply arg'或类似的东西吗? –

+1

@oxbow_lakes:是的,我可以这样做,但对于我的口味来说,它仍然过于冗长(而且神秘)。 – missingfaktor

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

+0

我不明白这个问题。 :(你能否详细说明一下? – missingfaktor

+0

我现在明白了你的观点,我不太在意这个名字,他们可以用其他的名字加上它 – missingfaktor

+0

@missingfaktor啊,好的,我建议'否则'。:-) –

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] 
相关问题