2016-12-12 53 views
6

在coursera函數式編程課程中,我遇到了一個微妙的概念。函數類型之間的子類型

如果A2 <:A1B1 <:B2,然後(A1 => B1)<:(A2 => B2)

正當性

  • 時我們將一個參數傳遞給A2,並且由於子類型關係,我們可以將相同的參數傳遞給A1。
  • 然後應用功能A1 => B1
  • 然後該函數給出B1和因爲亞型如果我們繪製該維恩圖,其有資格作爲B2

的,

  • 圖1 diagram 1

  • 圖2 diagram 2

    • 這是正確的圖嗎?
    • 如何用維恩圖解釋結果?

參考:Youtube video

由於

回答

4

讓我們對於F2

呼叫(A1 => B1)爲F1和(A2 => B2)對於函數F1到是另一個函數F2的子類型,我們需要類型系統來接受它在F2的地方。

您可以將參數A的任何子類型傳遞給接受A但沒有超類型的函數。這意味着,對於F1作爲F2的子類型,它必須至少接受F2接受的所有參數,因此A1必須是A2的超類型。

另一方面,F1的輸出必須至少與F2的輸出一樣詳細,以便可以在任何可以使用F2輸出的地方使用。這意味着B1必須是B2的子類型。

我不確定圖表是一種很好的方式來可視化這些如何組合在一起,但我會說,在這兩者中,圖表1是最準確的。

讓我們來看一個例子: 說你具備的功能f1(s: Set): Set 然後f2(s: Iterable): SortedSet是F1的一個亞型,因爲它可以代替F1的使用。

f1要求其參數類型爲Set或任何子類型Set。所有這些論點在f2中也是有效的。 f1的輸出是Set,所以f2的輸出必須可用作Set。由於SortedSetSet的子類型,因此也是如此。