2011-10-11 61 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] 
相關問題