爲什麼在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