2

這兩個F#類型簽名之間有什麼區別(如果有的話)?參數多態性與亞型多態性F#

UseTheStream<'a when 'a :> Stream> : 'a -> unit 

UseTheStream : (stream : Stream) -> unit 

他們是否意味着在這種情況下,同樣的事情?

MSDN說下面講(:>)類型的約束

type-parameter :> type -- The provided type must be equal to or derived from the type  specified, or, if the type is an interface, the provided type must implement the interface. 

這表明這兩個簽名都在說同樣的事情。所以功能上,他們有什麼不同?

回答

15

它們是不同的。最重要的是,第一個功能是通用的。在您的例子,它可能沒有關係,但如果類型參數影響函數的返回類型,它的作用:

let UseTheStream (stream: #Stream) = stream 
let UseTheStreamStrict (stream: Stream) = stream 

let s1 = new MemoryStream() |> UseTheStream 
let s2 = new MemoryStream() |> UseTheStreamStrict 

s1MemoryStreams2Stream

注意:#T'U when 'U :> T的簡寫。

+0

謝謝你爲我澄清這一點。 – Eric

+0

不客氣。 – Daniel