在coursera函數式編程課程中,我遇到了一個微妙的概念。函數類型之間的子類型
如果A2 <:A1和B1 <:B2,然後(A1 => B1)<:(A2 => B2)
正當性
- 時我們將一個參數傳遞給A2,並且由於子類型關係,我們可以將相同的參數傳遞給A1。
- 然後應用功能A1 => B1
- 然後該函數給出B1和因爲亞型如果我們繪製該維恩圖,其有資格作爲B2
的,
由於
在coursera函數式編程課程中,我遇到了一個微妙的概念。函數類型之間的子類型
如果A2 <:A1和B1 <:B2,然後(A1 => B1)<:(A2 => B2)
正當性
的,
由於
讓我們對於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
。由於SortedSet
是Set
的子類型,因此也是如此。