参数多态性与亚型多态性F#

时间:2012-09-28 14:45:45

标签: inheritance f# functional-programming parametric-polymorphism subtyping

这两个F#类型签名之间有什么区别(如果有的话)?

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

UseTheStream : (stream : Stream) -> unit

在这种情况下他们的意思是一样的吗?

msdn说明以下关于(:&gt;)类型约束

的内容
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.

这表明这两个签名说的是同一件事。从功能上来说,它们有何不同?

1 个答案:

答案 0 :(得分:15)

他们是不同的。最重要的是,第一个功能是通用的。在您的示例中,它可能无关紧要,但如果type参数影响函数的返回类型,则执行:

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的缩写。