Параметрический полиморфизм и полиморфизм подтипов 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.

Это будет означать, что две подписи говорят об одном и том же. Итак, функционально, чем они отличаются?


person Eric    schedule 28.09.2012    source источник


Ответы (1)


Они разные. Самое главное, что первая функция является универсальной. В вашем примере это, вероятно, не имеет значения, но если параметр типа влияет на тип возвращаемого значения функции, он влияет:

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

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

s1 is MemoryStream. s2 is Stream.

ПРИМЕЧАНИЕ. #T — это сокращение от 'U when 'U :> T.

person Daniel    schedule 28.09.2012
comment
Спасибо, что разъяснили это для меня. - person Eric; 28.09.2012