簡體   English   中英

此Scala示例中的哪個子類型函數是?

[英]Which is the sub-type function in this Scala example?

我正在閱讀Martin Odersky的Scala-by-example(2014)。 在第61頁上,可以說從String類型到Int類型的函數表示為特征Function1 [String,Int]的實例。 其中Function1定義為:

trait Function1[-A,+B] {def apply(x: A): B}

也有人說

如果S'是S的子類型,並且T是T'的子類型,則S => T是S'=> T'的子類型。

他使用以下代碼示例: val f: (AnyRef => Int) = x => x.hashCode() val g: (String => Int) = fg("abc")

所以這是我的問題。 由於String是AnyRef的子類型,因此我假設在此示例中f表示g的子類型。 那是對的嗎? 如果是這樣,請解釋該確定中的邏輯。

如果VU的子類型,則V可以位於U可以位於的任何位置。

如果您有AnyRef => Int ,可以隨時使用String => Int嗎? 是! StringAnyRef因此您可以傳遞它。

因此, AnyRef => IntString => Int的子類型。 通過說函數的參數是相反的來描述這種關系(這是正常情況下的“倒退”)。

也就是說, 實例 fg不一定有任何關系。 但是它們的類型可以。

f和g函數,函數具有類型差異,它允許類型參數的子類型和超類型: http : //docs.scala-lang.org/tutorials/tour/variances.html

在scala終端中運行以下代碼將為您提供與運行示例相同的結果。

g被聲明為類型(AnyRef => Int)的函數,它將實現Function為:

val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
   def apply(x: AnyRef): Int = x.hashCode()
}

它定義為接受AnyRef類型的參數AnyRef返回Int的函數。

然后,將g定義為接受String並返回Int的函數。 它設置為等於f,因此變為:

val g = new Function[String /*Supertype of AnyRef*/, Int] {
    def apply(x: String): Int = x.hashCode()
}

雖然,在這種情況下g不是新函數。 g只是對f的另一個引用。 本質上,g被類型轉換為Function[String, Int]

編輯:由於AnyVal是Int的子類型,您也可以這樣做:

val gg: (String => AnyVal) = f

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM