2014-06-12 107 views
-1

功能定義如下:斯卡拉:PartialFunction的功能定義是PartialFunction的曖昧

trait PartialFunction[-A, +B] extends (A) ⇒ B 

PartialFunction將允許我們通過使用casecollect上收集來過濾。 例如,當您有整數列表並且PartialFunction isEven [Int,String]時,如果集合中的值是偶數,它將轉換爲String。因此,它會返回定義中返回類型爲+B的新集合。

我的問題是,爲什麼contravariant -Acovariance +B?它基本上有能力接受任何輸出的輸入。爲什麼我們需要指示輸入應該是A類型的任何類型或超類型,並且返回類型應該是B或其子類?我們不能只說:

trait PartialFunction[A, B] 
+1

順便說一下,這個函數協變/反變換的規則不僅在scala中。 –

回答

4

不,它不是「基本上允許它接受任何輸入到任何輸出」。協變和逆變不是微不足道的(在數學意義上)關係,它們嚴格按照約束類型來定義 - 正如你可能意識到的那樣。

類型界限,即參數逆變和返回類型的協方差的這種特殊形式是一種普遍的現象,並不限於Scala和來源於function types from formal type theory概念,特別是:

如果T1→T2是函數類型,那麼它的子類型是具有屬性T1 <:S1和S2 <:T2的任何函數S1→S2。

允許所述函數類型的明確的子類型關係。

+0

我的問題是部分功能,爲什麼co-contra差異被注意到。一些例子會有幫助。 – Mayumi

+1

與非部分函數的原因完全相同。你爲什麼期望他們會不同? –

+0

@Mayumi:正如Alexey所說。或者你需要一個通用的例子嗎? –